1

誰かがSpringで定義されているDefaultMessageListenerContainerを優雅に停止する方法を教えてもらえますかreceiveTimeout = -1(つまり、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)

メッセージを消費し続ける必要がある他のリスナーがあるため、接続を閉じることができません。

4

1 に答える 1

1

receivetimeoutこれが、コンテナがシャットダウンされたかどうかをスレッドが確認できるようにするための要点です。-1 に設定すると、メッセージがあるまでスレッドが JMS クライアントでブロックされます。タイムアウト、コンテナの状態の確認、および別の受信のオーバーヘッドはあまりありません。デフォルトが気に入らない場合は、より大きな数値に設定してください (コンテナーをシャットダウンする際の遅延に耐えることができる限り)。ただし、-1 に設定すると、表示されている動作が発生します。

于 2013-02-06T14:04:07.653 に答える