2013-05-10 17 views
7

oracleでAQを作成し、Javaで2つのJMSコンシューマを書き込んでキューを待機します。私はときどき待ち行列にいくらかのメッセージを生成することを観察しました。キューからデキューされたメッセージの数は、キューに入れられた数よりも大きくなります。つまり、一部のメッセージは2回消費されます。 multiple_consumers => FALSEOracle AQの同じメッセージが2回配信される

およびJMS消費者は、私がこのような行為のために考えられる理由を学ぶ助けてくださいCLIENT_ACKNOWLEDGE mode

で作業しているし、それが解決策だ - :

私は、プロパティを持つキューを作成しました。したがって、問題を再現して上記の問題を解決し、複数のJMSコンシューマが同じAQを待機している場合に、エンキューされたメッセージの数がデキューされたメッセージの数になるようにすることができます。

答えて

3

コードが表示されていないと、通常CLIENT_ACKNOWLEDGEは肯定応答を手動で送信していると言います。 ackを送信しないと、メッセージは削除されず、ブローカは後で(接続を再起動したときなど)再配信を試みます。これがあなたの懸念の原因かもしれません。

+0

実際にプロセスはConsumerがメッセージを消費し、それをデータベーステーブルに記録し、ACKを送信するようなものです。処理中に何らかの例外がある場合、そのメッセージは例外キューに移動されます。 私は複数のJMSコンシューマを作成しました。システムが効率的に動作し、高い可用性が確保されるようにします。 これは、ACKが行われないか、または例外が生成されるようなシナリオでメッセージが一度消費されることを保証します。 –

+0

しかし、それはとにかく(確かにackが送信されていない)最も可能性の高い理由の1つです。私はデキューカウンタと、デキューをどのように計算するか(つまり、デキューされていないが送信されたメッセージがデキューされたかどうか、ロールバックされたトランザクションなどについて) コードサンプルと詳細情報をQに追加してより良い回答を得てください。 –

+0

実際、私は、エンキューされたメッセージの数とデキューされたメッセージの数を数え、そのようなシナリオを得る確率は非常にまれなテストシナリオを実行しました。実際には、私は15Kのメッセージを待ち行列に入れ、それをデキューしたようです。このテストを20〜30回実行し、2〜3回だけデキューされたカウントがエンキューされたカウントよりも大きいことがわかりました。 –

関連する問題