我有一项服务旨在使用 JMS 队列中的消息。这段代码似乎永远不会在关机时退出,并且卡在第 565 行的循环中org.springframework.jms.listener.DefaultMessageListenerContainer
。
知道它会这样做吗?下面是相关配置:
@Bean
@Primary
public ConnectionFactory myConnectionFactory() {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
ActiveMQPrefetchPolicy activeMQPrefetchPolicy = new ActiveMQPrefetchPolicy();
activeMQPrefetchPolicy.setQueuePrefetch(0); // 1 message per connection, no prefetch
connectionFactory.setPrefetchPolicy(activeMQPrefetchPolicy);
connectionFactory.setBrokerURL("tcp://" + jmsSettings.getHost() + ":" + jmsSettings.getPort());
return connectionFactory;
}
@Bean
public JmsMessageDrivenChannelAdapter messageSource() {
DefaultMessageListenerContainer defaultMessageListenerContainer = Jms.container(myConnectionFactory(), "incoming.queue")
.maxConcurrentConsumers(jmsSettings.getMaxConcurrentConnections())
.get();
return Jms.messageDrivenChannelAdapter(defaultMessageListenerContainer)
.get();
}
线程转储会产生大量信息。我相信这是相关的部分。
"DefaultMessageListenerContainer-1": awaiting notification on [1f9c4a73]
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at org.apache.activemq.SimplePriorityMessageDispatchChannel.dequeue(SimplePriorityMessageDispatchChannel.java:87)
at org.apache.activemq.ActiveMQMessageConsumer.dequeue(ActiveMQMessageConsumer.java:452)
at org.apache.activemq.ActiveMQMessageConsumer.receive(ActiveMQMessageConsumer.java:575)
at org.springframework.jms.support.destination.JmsDestinationAccessor.receiveFromConsumer(JmsDestinationAccessor.java:130)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveMessage(AbstractPollingMessageListenerContainer.java:416)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:302)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:255)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1166)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1158)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1055)
at java.lang.Thread.run(Thread.java:745)
问题似乎出在这个代码块中。activeInvokerCount 永远不会变为 0,因此它卡在循环中。
org.springframework.jms.listener.DefaultMessageListenerContainer
// Waiting for AsyncMessageListenerInvokers to deactivate themselves...
while (this.activeInvokerCount > 0) {
if (logger.isDebugEnabled()) {
logger.debug("Still waiting for shutdown of " + this.activeInvokerCount +
" message listener invokers");
}
long timeout = getReceiveTimeout();
if (timeout > 0) {
this.lifecycleMonitor.wait(timeout);
}
else {
this.lifecycleMonitor.wait();
}
}
启用跟踪日志记录在尝试关闭时会显示此信息。一遍又一遍地。
2017-04-26 13:23:49.127 TRACE 8752 --- [WriteCheckTimer] o.a.a.t.AbstractInactivityMonitor : tcp://localhost/127.0.0.1:61616@49451 no message sent since last write check, sending a KeepAliveInfo
2017-04-26 13:23:49.127 DEBUG 8752 --- [yMonitor Worker] o.a.a.t.AbstractInactivityMonitor : Running WriteCheck[tcp://127.0.0.1:61616]
2017-04-26 13:23:50.511 DEBUG 8752 --- [n(12)-127.0.0.1] o.s.j.l.DefaultMessageListenerContainer : Still waiting for shutdown of 1 message listener invokers
2017-04-26 13:23:51.512 DEBUG 8752 --- [n(12)-127.0.0.1] o.s.j.l.DefaultMessageListenerContainer : Still waiting for shutdown of 1 message listener invokers
2017-04-26 13:23:52.512 DEBUG 8752 --- [n(12)-127.0.0.1] o.s.j.l.DefaultMessageListenerContainer : Still waiting for shutdown of 1 message listener invokers
2017-04-26 13:23:53.512 DEBUG 8752 --- [n(12)-127.0.0.1] o.s.j.l.DefaultMessageListenerContainer : Still waiting for shutdown of 1 message listener invokers
2017-04-26 13:23:54.512 DEBUG 8752 --- [n(12)-127.0.0.1] o.s.j.l.DefaultMessageListenerContainer : Still waiting for shutdown of 1 message listener invokers
2017-04-26 13:23:55.512 DEBUG 8752 --- [n(12)-127.0.0.1] o.s.j.l.DefaultMessageListenerContainer : Still waiting for shutdown of 1 message listener invokers
2017-04-26 13:23:56.512 DEBUG 8752 --- [n(12)-127.0.0.1] o.s.j.l.DefaultMessageListenerContainer : Still waiting for shutdown of 1 message listener invokers
2017-04-26 13:23:57.512 DEBUG 8752 --- [n(12)-127.0.0.1] o.s.j.l.DefaultMessageListenerContainer : Still waiting for shutdown of 1 message listener invokers
2017-04-26 13:23:58.512 DEBUG 8752 --- [n(12)-127.0.0.1] o.s.j.l.DefaultMessageListenerContainer : Still waiting for shutdown of 1 message listener invokers
2017-04-26 13:23:59.127 DEBUG 8752 --- [WriteCheckTimer] o.a.a.t.AbstractInactivityMonitor : WriteChecker 10000 ms elapsed since last write check.
2017-04-26 13:23:59.127 TRACE 8752 --- [WriteCheckTimer] o.a.a.t.AbstractInactivityMonitor : tcp://localhost/127.0.0.1:61616@49451 no message sent since last write check, sending a KeepAliveInfo
2017-04-26 13:23:59.127 DEBUG 8752 --- [yMonitor Worker] o.a.a.t.AbstractInactivityMonitor : Running WriteCheck[tcp://127.0.0.1:61616]
2017-04-26 13:23:59.512 DEBUG 8752 --- [n(12)-127.0.0.1] o.s.j.l.DefaultMessageListenerContainer : Still waiting for shutdown of 1 message listener invokers
2017-04-26 13:24:00.512 DEBUG 8752 --- [n(12)-127.0.0.1] o.s.j.l.DefaultMessageListenerContainer : Still waiting for shutdown of 1 message listener invokers
2017-04-26 13:24:01.512 DEBUG 8752 --- [n(12)-127.0.0.1] o.s.j.l.DefaultMessageListenerContainer : Still waiting for shutdown of 1 message listener invokers
2017-04-26 13:24:02.512 DEBUG 8752 --- [n(12)-127.0.0.1] o.s.j.l.DefaultMessageListenerContainer : Still waiting for shutdown of 1 message listener invokers
2017-04-26 13:24:03.512 DEBUG 8752 --- [n(12)-127.0.0.1] o.s.j.l.DefaultMessageListenerContainer : Still waiting for shutdown of 1 message listener invokers
2017-04-26 13:24:04.512 DEBUG 8752 --- [n(12)-127.0.0.1] o.s.j.l.DefaultMessageListenerContainer : Still waiting for shutdown of 1 message listener invokers