MessageConsumer.receive(long)
受信時にタイムアウトを指定できます。
ただし、プロデューサを (プロセスを強制終了するなどして) 終了させた場合、コンシューマでの受信が常にタイムアウトするとは限らないことがわかりました。実際、永遠に待機し、プロセスが終了しないことがあります。
接続にを追加できることがわかりましたExceptionListener
が、これにはいくつかの欠点があります。(1) 実行しようとしていた操作以外のエラーが発生する可能性があります。(2) receive() 自体は、必ずしも完了するとは限りません。(3) 以前は ExceptionListener を使用していたようで、詳細がわからない他の問題が発生していました。
私たち (私たちは ActiveMQ を使用しています) にとって実行可能と思われる 1 つの潜在的なハックは、ストールが発生したときにスレッドが wait() になることです (これはほぼ確実に実装固有ですが、一般的な選択のようです)。したがって、例外が発生した場合は、 receive() 呼び出しを実行しているスレッドを中断できます。
これはまともな解決策ですか?この問題に対して、より信頼性が高く、よく知られており、一般的に実装されている回避策はありますか?