【问题标题】:Spring JmsListener start/stop while application is runningSpring JmsListener 在应用程序运行时启动/停止
【发布时间】:2020-06-30 21:24:41
【问题描述】:

我在应用程序运行时无法启动 JmsListener。 我试过这个answer on the topic,但没有运气。

我在JmsListenerContainerFactory 中将 autoStartup 设置为 false,并且我有消息在队列中等待。但是当我在下面的代码中调用控制器时,什么也没有发生。 JmsLister 不开始消费消息。

任何帮助将不胜感激。

控制器代码:

@RestController
public class MessageController {

    private final JmsListenerEndpointRegistry jmsListenerEndpointRegistry;

    public MessageController(JmsListenerEndpointRegistry jmsListenerEndpointRegistry) {
        this.jmsListenerEndpointRegistry = jmsListenerEndpointRegistry;
    }

    @GetMapping("messages/start")
    public ResponseEntity start() {
        if(jmsListenerEndpointRegistry.isRunning())
            return ResponseEntity.badRequest().build(); // second time I request this endpoint it says it is running

        jmsListenerEndpointRegistry.getListenerContainerIds().forEach(id -> {
            MessageListenerContainer listenerContainer = jmsListenerEndpointRegistry.getListenerContainer(id);
            if (listenerContainer != null) {
                listenerContainer.start();
            }
        });
        jmsListenerEndpointRegistry.start();
        return ResponseEntity.ok().build();
    }
}

编辑:这是我向控制器发送请求时的调试日志:

19:59:41.231 [http-nio-8080-exec-2] DEBUG o.s.web.servlet.DispatcherServlet - GET "/messages/start", parameters={}
19:59:41.238 [http-nio-8080-exec-2] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped to MessageController#start()
19:59:53.764 [http-nio-8080-exec-2] DEBUG o.a.a.transport.WireFormatNegotiator - Sending: WireFormatInfo { version=12, properties={StackTraceEnabled=true, PlatformDetails=Java, CacheEnabled=true, Host=mqserver, TcpNoDelayEnabled=true, SizePrefixDisabled=false, CacheSize=1024, ProviderName=ActiveMQ, TightEncodingEnabled=true, MaxFrameSize=9223372036854775807, MaxInactivityDuration=30000, MaxInactivityDurationInitalDelay=10000, ProviderVersion=5.15.11}, magic=[A,c,t,i,v,e,M,Q]}
19:59:53.773 [ActiveMQ Transport: tcp://mqserver/127.0.0.1:49040@48600] DEBUG o.a.a.transport.InactivityMonitor - Using min of local: WireFormatInfo { version=12, properties={StackTraceEnabled=true, PlatformDetails=Java, CacheEnabled=true, Host=mqserver, TcpNoDelayEnabled=true, SizePrefixDisabled=false, CacheSize=1024, ProviderName=ActiveMQ, TightEncodingEnabled=true, MaxFrameSize=9223372036854775807, MaxInactivityDuration=30000, MaxInactivityDurationInitalDelay=10000, ProviderVersion=5.15.11}, magic=[A,c,t,i,v,e,M,Q]} and remote: WireFormatInfo { version=9, properties={CacheSize=1024, SizePrefixDisabled=false, TcpNoDelayEnabled=true, StackTraceEnabled=true, CacheEnabled=true, MaxFrameSize=9223372036854775807, TightEncodingEnabled=true, MaxInactivityDuration=30000, MaxInactivityDurationInitalDelay=10000}, magic=[A,c,t,i,v,e,M,Q]}
19:59:53.774 [ActiveMQ Transport: tcp://mqserver/127.0.0.1:49040@48600] DEBUG o.a.a.transport.WireFormatNegotiator - Received WireFormat: WireFormatInfo { version=9, properties={CacheSize=1024, SizePrefixDisabled=false, TcpNoDelayEnabled=true, StackTraceEnabled=true, CacheEnabled=true, MaxFrameSize=9223372036854775807, TightEncodingEnabled=true, MaxInactivityDuration=30000, MaxInactivityDurationInitalDelay=10000}, magic=[A,c,t,i,v,e,M,Q]}
19:59:53.774 [ActiveMQ Transport: tcp://mqserver/127.0.0.1:49040@48600] DEBUG o.a.a.transport.WireFormatNegotiator - tcp://mqserver/127.0.0.1:49040@48600 before negotiation: OpenWireFormat{version=12, cacheEnabled=false, stackTraceEnabled=false, tightEncodingEnabled=false, sizePrefixDisabled=false, maxFrameSize=9223372036854775807}
19:59:53.790 [ActiveMQ Transport: tcp://mqserver/127.0.0.1:49040@48600] DEBUG o.a.a.transport.WireFormatNegotiator - tcp://mqserver/127.0.0.1:49040@48600 after negotiation: OpenWireFormat{version=9, cacheEnabled=true, stackTraceEnabled=true, tightEncodingEnabled=true, sizePrefixDisabled=false, maxFrameSize=9223372036854775807}
19:59:53.895 [http-nio-8080-exec-2] DEBUG o.s.j.l.DefaultMessageListenerContainer - Established shared JMS Connection
19:59:53.896 [http-nio-8080-exec-2] DEBUG o.s.j.l.DefaultMessageListenerContainer - Resumed paused task: org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker@4fc72d52
20:00:00.326 [DefaultMessageListenerContainer-1] DEBUG o.a.a.thread.TaskRunnerFactory - Initialized TaskRunnerFactory[ActiveMQ Session Task] using ExecutorService: java.util.concurrent.ThreadPoolExecutor@4364b2e9[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]

编辑: 我正在针对错误的 ActiveMq 实例进行测试,但接受的答案帮助我以简单有效的方式测试和调试“错误”

【问题讨论】:

  • 看起来不错;您是否尝试过启用调试日志记录?还是在调试器中运行?
  • 使用调试日志编辑问题

标签: spring spring-boot jms spring-jms


【解决方案1】:

奇怪;这对我来说很好......

@SpringBootApplication
public class So60762328Application {

    public static void main(String[] args) {
        SpringApplication.run(So60762328Application.class, args);
    }

    @JmsListener(destination = "foo")
    public void listen(String in) {
        System.out.println(in);
    }

    @Bean
    public ApplicationRunner runner(JmsTemplate template, DefaultJmsListenerContainerFactory factory,
            JmsListenerEndpointRegistry registry) {

        factory.setAutoStartup(false);
        return args -> {
            template.convertAndSend("foo", "bar");
            System.out.println("Hit Enter to start container(s)");
            System.in.read();
            registry.getListenerContainers().forEach(container -> container.start());
        };
    }

}

Hit Enter to start container(s)

2020-03-19 15:18:47.046 DEBUG 46151 --- [           main] o.s.j.l.DefaultMessageListenerContainer  : Established shared JMS Connection
2020-03-19 15:18:47.046 DEBUG 46151 --- [           main] o.s.j.l.DefaultMessageListenerContainer  : Resumed paused task: org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker@189aa67a
2020-03-19 15:18:47.047 DEBUG 46151 --- [enerContainer-1] o.s.j.c.CachingConnectionFactory         : Registering cached JMS Session for mode 0: ActiveMQSession {id=ID:Gollum2.local-53059-1584645521078-4:1:2,started=true} java.lang.Object@5f2fc1ae
2020-03-19 15:18:47.057 DEBUG 46151 --- [enerContainer-1] o.s.j.l.DefaultMessageListenerContainer  : Received message of type [class org.apache.activemq.command.ActiveMQTextMessage] from consumer [ActiveMQMessageConsumer { value=ID:Gollum2.local-53059-1584645521078-4:1:2:1, started=true }] of session [Cached JMS Session: ActiveMQSession {id=ID:Gollum2.local-53059-1584645521078-4:1:2,started=true} java.lang.Object@5f2fc1ae]
2020-03-19 15:18:47.058 DEBUG 46151 --- [enerContainer-1] .s.j.l.a.MessagingMessageListenerAdapter : Processing [org.springframework.jms.listener.adapter.AbstractAdaptableMessageListener$MessagingMessageConverterAdapter$LazyResolutionMessage@564c24f3]
bar

你好像不见了Registering cached JMS Session for mode 0:

尝试将日志级别提高到 TRACE。

【讨论】:

  • 也许可以进行线程转储以查看 [DefaultMessageListenerContainer-1] 线程在做什么(或者它是否丢失)。
  • 一种可能性是容器的TaskExecutor 没有可用的线程。默认执行程序不会发生这种情况。
  • 天啊,我有不同环境的activemq-instances,但它们之间的唯一区别是端口号,并且一直在错误的实例上进行测试:/。但是由于您提供给我的巧妙的测试应用程序,我接受了您的回答。它真的非常帮助我调试!
猜你喜欢
  • 2016-07-19
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 2017-03-05
相关资源
最近更新 更多