javadocによると、javax.jms.MessageConsumerでreceive()を呼び出すと、メッセージが生成されるまで、またはメッセージコンシューマが閉じられるまで無期限にブロックされます。javax.jms.MessageConsumerがコンシューマを閉じたときに受信時にハングする
私はreceive()が呼び出されているスレッドを持っています。スレッドシャットダウンの一環としてclose()を呼び出していますが、コンシューマはまだreceive()をブロックしていますので、スレッドはシャットダウンしません。私のコードの要点は:
public String receiveMessage() {
...
...
System.out.println("About to receive")
TextMessage message = (TextMessage) consumer.receive();
System.out.println("No longer receiving")
...
...
}
public void stop() {
try {
if (consumer != null) {
consumer.close();
}
} catch (JMSException ex) {
throw new IllegalStateException(ex);
}
}
デバッガでは、close()が呼び出されても受信はまだブロックされていることがわかります。タイムアウトを指定してreceive()メソッドを使用すると、タイムアウトが切れるまでブロックされます。
私はすべてが正しいと思われます。うまくいけば、誰かが私が間違っていることを教えてくれるでしょう。
JMSは、根底にある実装に固有のものであることはよく知られています。それはあなたがあなたが使っているものを言ったら助けになるでしょう。 – skaffman
お返事ありがとうございます。 IBM MQ 7.0.0.2 – DaveRlz
[receiveNoWait](http://docs.oracle.com/javaee/1.4/api/javax/jms/MessageConsumer.html#receiveNoWait()) –