2011-05-17 16 views
1

以下のシナリオで何が起こるかわかりませんが、誰かが説明すると大きな助けになります。JMSメッセージの消費

プロデューサー(P)は、メッセージM1、M2、M3、M4、M5、M6、M7を送信します。時間T1からT7に送信されたものとする。

(AMQ)ActiveMQのは、JMSプロバイダとして使用されていると仮定し

メッセージコンシューマ(L)が話題にバインドされたリスナーになります。 トピック名:jmsTopic

シナリオ1:

AMQは、LがAMQにjmsTopicに接続されていない場合、実行されています。 PはM1からM7をjmsTopicに送信します。 LがT7より大きい時間T8でjmsTopicに接続されている場合は、メッセージM1からM7を受信するか、時間T8後にトピックに送信されたメッセージのみを受信します。

シナリオ2: AMQが実行されていて、Lが接続されており、jmsTopicを待機している場合、PはM1からM4を送信します。 LはM1〜M4を受信する。その間、LはM1からM4を処理し、PはM5からM7を送信するが、LはM4の処理中にクラッシュする。 Lが再びjmsTopicに接続すると、M5からM7を受信するか、またはLがjmsTopicに接続した後に送信されたメッセージのみがLによって受信されます。

シナリオ3: AMQが実行中です。 jmsTopic、PはM1からM7を送信します。しかし、AMQはクラッシュする。 AMQステータスを認識していて、AMQが起動していれば再接続します。

答えて

1

シナリオ1:AMQが実行され、LはAMQにjmsTopicに接続 ありません。 Pは M1からM7をjmsTopicに送信します。 Lがが時刻j8TopicにT8 がT7より大きい場合は、 はメッセージM1からM7を受信するか、 メッセージは時刻T8の後にトピック に送信されますか。

配送の全ポイントは配送を保証するものです。リスナーがキューからメッセージを取り除くまではメッセージは処理されないため、T8より前に到着したすべてのメッセージがそこにあります。

シナリオ2:AMQが実行され、Lは 接続さjmsTopicを聴いている、P はM4にM1を送信します。 LはM1〜M4を受信する。 LのM1からM4までのプロセスでは、 PはM5をM7に送信しますが、LはM4の処理中に をクラッシュさせます。 L は再びjmsTopic、 に自分自身を接続している場合は、M7にM5を受けるか、LがjmsTopicに接続 はL.

によって
#1と同じ

受信された後に送られただけ メッセージん:すべてのメッセージをリスナーはM5以降を受信します。

シナリオ3:AMQが実行され、Lは 接続さjmsTopicを聴いている、P はM7にM1を送信します。しかし、AMQはクラッシュする。 はAMQステータスをLに認識し、AMQが起動して実行されると に再接続します。

保証付き配送のためにAMQを設定します。すべてのメッセージがシリアライズされ、領収書の配送が保証されます。

+0

返信いただきありがとうございます。 "_ noメッセージは、リスナーがキューから取り出すまで処理されます_"これは、パブ/サブスクライバドメインにも適用されます。つまり、これはトピックに対して同じように動作します。私は、パブ/サブスクライバドメインの場合にメッセージが削除されないと考えています。メッセージのコピーが各リスナーに送信されます。 – firefox784

+0

トピックは異なる必要があります。サブスクライバは、サブスクライブ後に投稿されたトピックのみを取得できます。 – duffymo

+1

これをここに置いて参考にしてください。パブリッシャーとサブスクライバーはタイミングに依存します。トピックにサブスクライブするクライアントは、サブスクリプションを作成した後に発行されたメッセージのみを消費し、サブスクライバは引き続きアクティブでなければなりませんメッセージを消費するようになりました。」... [link] http://download.oracle.com/javaee/5/tutorial/doc/bncdx.html#bnceb – firefox784

関連する問題