优雅地停止具有receiveTimeout = -1的DefaultMessageListenerContainer

时间:2013-02-06 07:37:40

标签: spring jms activemq spring-jms

有人能指出我在Spring中使用receiveTimeout = -1来定义一个默认停止DefaultMessageListenerContainer的方法(即它正在使用阻塞版本的javax.jms.MessageConsumer#receive)?

实际上,我已经尝试过DMLC的stop()和shutdown()方法,但是消费者线程仍然停留在receive()调用上。

"heartBeatContainer-1" prio=6 tid=0x0304d800 nid=0x1d20 in Object.wait() [0x037ef000]
java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x22c48ab0> (a java.lang.Object)
    at java.lang.Object.wait(Object.java:485)
    at org.apache.activemq.SimplePriorityMessageDispatchChannel.dequeue(SimplePriorityMessageDispatchChannel.java:87)
    - locked <0x22c48ab0> (a java.lang.Object)
    at org.apache.activemq.ActiveMQMessageConsumer.dequeue(ActiveMQMessageConsumer.java:452)
    at org.apache.activemq.ActiveMQMessageConsumer.receive(ActiveMQMessageConsumer.java:504)
    at org.springframework.jms.connection.CachedMessageConsumer.receive(CachedMessageConsumer.java:70)
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveMessage(AbstractPollingMessageListenerContainer.java:430)
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:310)
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:263)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1069)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1061)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:958)
    at java.lang.Thread.run(Thread.java:662)

我无法关闭连接,因为还有其他侦听器应该继续使用消息。

1 个答案:

答案 0 :(得分:1)

这是receivetimeout的重点 - 所以线程可以检查容器是否已经关闭。将其设置为-1表示线程将在JMS客户端中阻塞,直到出现消息。超时,检查容器状态和进行另一次接收没有太多开销。如果您不喜欢默认值,请将其设置为更高的数字(只要您在关闭容器时可以延迟使用)。但是,将其设置为-1将导致您看到的行为。