0

私のセットアップ: JBoss 4.2.3 で動作する JBoss Messaging 1.4

1 つのトピックにサブスクライブする MDB がいくつかあり、MDB の onMessage() は、受信したメッセージをそれぞれ 1 つの Web サービスに配信しようとします。

私の問題は、Web サービスがオフラインの場合にサブスクリプションを一時停止する方法がわからないことです。

私の計画は、onMessage() で次のことを行うことです。

  1. Web サービスへの配信を試みる
  2. オフラインの場合:
  3. --> サブスクリプションを一時停止します
  4. --> onMessage() で例外をスローして、Web サービスが再びオンラインになるまで JMS がメッセージを再配信するようにします。
  5. --> サブスクリプションを開始

すべてのサブスクライバーではなく、問題のある 1 つのサブスクリプションのみを一時停止したい。

これを解決する方法について何か提案はありますか?

4

3 に答える 3

1

サブスクリプションを一時停止する理由を教えてください。例外をスローして、たとえば 30 秒間スリープ状態にします。例外は JMS トランザクションをロールバックし、メッセージをキューに戻します。

スリープは、Web サービスがオフラインのときにこれが DoS 攻撃にならないようにします (1 秒間に何度もメッセージを配信およびロールバックすることにより)。

[編集] (パフォーマンス上の理由から) 同じトピックに多数のリスナーがある場合、「Web サービス ダウン」メッセージをリッスンし、この場合はすべての通常のリスナーのサブスクライブを解除する独立したプロセスを作成することをお勧めします。

その後、プロセスはサービスが再び利用可能になるまで待機し、リスナーを再サブスクライブする必要があります。

于 2009-08-11T14:47:04.330 に答える
0

これは、メッセージ リスナーを一時的に無効にする方法のシナリオとよく似ています。

唯一の違いは、プレーン Java クライアントではなく MDB であることです。Web サービスが再び機能するまで、onMessage() から戻らないようにしてもらえますか? onMessage() ロジックをブロックまたはスリープするように調整する必要があります。スリープは EJB 仕様の技術的な違反ですが、代わりに何を検討しているかによっては、それほど醜いものではないかもしれません。

于 2009-08-14T18:11:51.117 に答える
0

トピック内の受信メッセージをリッスンしているリスナーを停止できませんか?

Listener のドキュメントへのリンクは次のとおりで、一時停止メソッドがあります。同じアプローチに従うことができ、詳細はそれらの分布にあります。 http://synapse.apache.org/apidocs/org/apache/synapse/transport/jms/JMSListener.html

コンシューマを停止する方法を示す別の例: http://livedocs.adobe.com/blazeds/1/javadoc/flex/messaging/services/messaging/adapters/JMSConsumer.html#stop()

それらはすべて基本的に同じです。

于 2009-08-11T18:54:02.127 に答える