6

データベース トランザクションはおなじみの概念です。

try {
  ...
  ..
  updateDB()
  ..
  ...
  commit();
} catch error {
  rollback();
}

エラーが発生した場合、updateDB によって行われた変更は破棄されます。

メッセージ キュー トランザクションのロールバックが何を元に戻すかを知りたかったのです。

try{
  ...
  ...
  //EDIT: swapped the order of receive and send
  Message m = queue1.receiveMessage(..)
  ..
  ..
  queue2.sendMessage(..)
  ..
  ..
  commit();
} catch error {
  rollback();
}

具体的には、ロールバックは何をしますか

  1. メッセージの送信をキャンセルする
  2. メッセージの受信を解除します。つまり、受信したメッセージをキューに戻します

または、データベースの tx アナロジーを拡張しすぎていますか。

ありがとう

編集:送信操作と受信操作が関連していることを意味しているわけではありません。メッセージ ブローカの状態を変更する 2 つの操作があることを言いたかっただけです。受信はキューからメッセージを取り出しますが、他のコンシューマが存在する場合は利用できません。

4

2 に答える 2

10

送信のロールバックは簡単で、メッセージは queue2 に置かれません。

受信のロールバックは、通常、メッセージをキュー (queue1) に戻します。JMS プロバイダーのセットアップと構成に応じて、メッセージは何度も再配信されます。トランザクションのロールバック回数が多すぎると (回数は構成可能)、「バックアウト キュー」 (またはデッド レター キュー) に入れられ、他のメッセージのキューがブロックされなくなります。通常、バックアウトされたメッセージには手動のエラー処理が必要です。

于 2012-12-15T09:59:42.560 に答える
0

はい、あなたはそれを伸ばしすぎています。

トランザクション モードでは、実際にはまだメッセージを送信していないqueue.receiveMessage()ため (「任意の」メッセージだけでなく、特定の応答メッセージを待機するように設定されていると仮定すると)、決して返されqueue.sendMessage()ません (トランザクションが終了したときに送信されます) 。関与する)。

ちなみによくある間違いです。JMS (非同期プロトコル) を同期通信に使用する場合、送受信サイクルを 1 つのトランザクションで構成されていると見なすのが自然です。しかし、そうではありません。トランザクション モードで発行sendMessage()すると、実際にはまだ何も起こりません。メッセージは、トランザクションがコミットされたときにのみ送信されます。

于 2012-12-15T07:27:23.360 に答える