2010-12-13 12 views
2

JMSメッセージを確実に宛先に送信できますか?確実には、例えばMessageProducer.send()何らかの理由でコールに失敗すると、自動的に再試行されます。私はトランザクションセッションが最後の手段として.recover()を使用するかもしれませんが、再試行はどうですか?例えば。私は、セッションが確立され、メッセージを送信しようとする間に断続的なネットワーク障害が発生しました。この場合、recover()はどのように役立ちますか?JMSメッセージを確実に送信するにはどうすればよいですか? (MessageProducer.send()エラーをフェイルオーバー)

+0

はい、JMSは完全にトランザクション可能です。しかし、あなたとあなたの質問はあまりにも曖昧になっています。 – skaffman

+0

返信いただきありがとうございます!より詳細な回答を得るには、どのような詳細を提供する必要がありますか?私は、「メッセージを確実に送信する」ためにグーグルで行っていましたが、これは意味のある結果をもたらしませんでした。信頼できる送信(プロデューサから宛先へ)を達成するためのヒントを教えてください。ありがとう! –

+0

どのキュー・マネージャーを使用していますか?どのような種類のトランザクションマネージャ抽象化(例:Jee、Spring)ですか?移植性とインプリメンテーションに依存しないことは強く求められていますか? – andcoz

答えて

1

私が知る限り、JMSはこのような動作をサポートしていません。あなたは特定のベンダーエクステンションを検索することができますが、IMHOでは、あなたのニーズに適したものを見つけることはほとんどありません。

  1. がそれを実装します。

    は、私はあなたの問題の2つだけのソリューションを参照してください。トランザクションを無効にするには、JMSセッションを手動で管理し、例外をキャッチし、必要に応じてトランザクションマネージャの「ロールバックのみ設定」機能を使用します。

  2. ローカルキューを使用してメッセージを格納し、バックグラウンドサービスを使用してそれらをターゲットリモートキューに移動します。多くのキューマネージャがこれをサポートしていることに注意してください。 Store and forward Queues of ActiveMQ。明らかに、この方法では、トランザクション境界にはリモートキューは含まれません。

私は2番目の解決策はあなたの問題に対する完全な答えではないことを知っていますが、何回も十分です。

1

JMSは、探している動作を指定していません。 JMSは、実際には、JMSブローカの観点からは一度だけ配信されているため、同じメッセージを2回取得して「機能的に重複した」メッセージと呼びます。

これはJMSの一部ではないため、答えはさまざまなベンダーの実装にあります。たとえば、WebSphere MQにはv7.0.1以降の「マルチインスタンス・キュー・マネージャー」という機能があります。 v7.0.1クライアントアプリケーションは自動的に接続を再試行し、障害の発生時にプライマリノードからセカンダリノードへQMgrを追跡します。これが発生している間にアプリケーションはブロックされ、フェールオーバーは認識されません。

しかし、このような動作をしても、アプリはまだ失敗のコードを作成する必要があります。たとえば、WMQの自動再接続(または任意のプロバイダの再接続)を使用している場合、ユーザが不定期にハングしないように、接続の復旧を待つ時間を調整する必要があるかもしれません。呼び出しがブロック解除されると、トランザクションはロールバックされ、コード内で再試行が行われなければなりません。これは、トランザクションがもはや有効ではない接続に関連付けられているため、適切です。

関連する問題