私のJMSアプリケーションでは、プロデューサーの一時キューを使用して、コンシューマーアプリケーションからの応答を受信できるようにしています。
このスレッドで言及されているのとまったく同じ問題に直面しています:http://activemq.2283324.n4.nabble.com/jira-Created-AMQ-3336-Temporary-Destination-errors-on-HA-failover-in -broker-network-with-Failover-tt-td3551034.html#a3612738
ネットワークで任意のブローカーを再起動すると、一時キューに応答を送信しようとしたときに、コンシューマーアプリケーションログに次のような多くのエラーが表示されていました。
javax.jms.InvalidDestinationException:
Cannot publish to a deleted Destination: temp-queue://ID:...
それから私はそこでゲイリーの応答が使用を提案しているのを見ました
jms.watchTopicAdvisories=false
クライアントのurlパラメータとしてbrokerURL
。この追加パラメーターを使用して、クライアントブローカーのURLをすぐに変更しました。ただし、このフェイルオーバーテストのためにネットワークでブローカーを再起動すると、次のようなエラーが発生します。
javax.jms.JMSException:
The destination temp-queue:
//ID:client.host-65070-1308610734958-2:1:1 does not exist.
ActiveMQ5.5バージョンを使用しています。そして、私のクライアントブローカーのURLは次のようになります。
failover:(tcp://amq-host1:61616,tcp://amq-host2.tred.aol.com:61616,tcp://amq-host3:61616,tcp://amq-host4:61616)?jms.useAsyncSend=true&timeout=5000&jms.watchTopicAdvisories=false
さらに、4つのブローカーの1つに対するactivemq構成XMLがあります: amq1.xml
ここの誰かがこの問題を調べて、この設定で私が犯している間違いを教えてください。
アップデート:
コードで要求/応答をどのように実行しているかをさらに明確にするには、次のようにします。
- 私はすでにプロデューサーごとの宛先(つまり一時キュー)を使用しており、これをすべてのメッセージのreply-toヘッダーに設定しています。
- 私はすでにJMSCorrelationIDヘッダーでメッセージごとの一意の相関識別子を送信しています。
- 私の知る限り、CamelとSpringでさえ、要求/応答メカニズムに一時キューを使用しています。唯一の違いは、Spring JMSの実装では、メッセージごとに一時キューが作成および破棄されるのに対し、プロデューサーの存続期間中は一時キューが作成されることです。この一時キューは、クライアント(プロデューサー)アプリがシャットダウンしたとき、またはこの一時キューにアクティブなプロデューサーが接続されていないことを認識したときにAMQブローカーによって破棄されます。
- 私はすでにプロデューサー側の各メッセージにメッセージの有効期限を設定しているので、メッセージが長時間(60秒)キューに保持されないようになっています。