私の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.
ActiveMQ 5.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
ここの誰かがこの問題を調べて、この設定で私が犯している間違いを教えてください。
コードでリクエスト/レスポンスをどのように行っているかをさらに明確にするには:
ブローカー属性org.Apache.activemq.broker.BrokerService#cacheTempDestinationsがあり、フェイルオーバーに役立ちます:ケース。 xml設定でこれをtrueに設定すると、クライアントの接続が切断されても一時宛先はすぐには削除されません。高速フェイルオーバー:再接続すると、一時キューから再びプロデューサーまたはコンシューム(あるいはその両方)が可能になります。
キャッシュの削除を処理するtimeBeforePurgeTempDestinations(デフォルトは5秒)に基づくタイマータスクがあります。
ただし、1つの注意点があります。activemq-coreには、その属性を使用するテストが見当たらないため、このテストについて保証することはできません。
一時的なキューは、要求/応答シナリオのリクエスター(プロデューサー)が接続するブローカーで作成されます。これらはjavax.jms.Session
から作成されるため、セッションが切断されると、クライアントの切断またはブローカーの障害/フェイルオーバーにより、これらのキューは永久に失われます。他のブローカーは、いずれかのコンシューマーがそれらのキューに応答しようとしたときに何が意味されるのか理解しません。したがって、あなたの例外。
これには、フェイルオーバーに対処し、すべてのメッセージを永続化することを想定し、アーキテクチャの考え方を変える必要があります。問題を攻撃する一般的な方法は次のとおりです。
queue:response.<client id>
。クライアントの数が限られている場合はクライアントIDが標準名になる可能性があり、クライアントの数が多い場合はUUIDになる可能性があります。JMSCorrelationID
ヘッダーで設定され、リクエストからレスポンスメッセージにコピーされます。これは、 Apache Camel が メッセージングでの要求と応答 に対して行うアプローチと同様です。
注意すべきことの1つは、クライアントが削除してもキューが消えないことです。そのため、応答メッセージが存続する時間を設定して、消費されていない場合はブローカーから削除されるようにしてください。未使用メッセージのバックログ。 期限切れのメッセージを自動的に破棄するデッドレターキュー戦略 も設定する必要があります。