2009-05-26 40 views
5

WebSPhere MQキューからメッセージを受信しました。私は処理しようとすると、いくつかの例外が表示されたら、メッセージをMQキューにロールバックします。メッセージがMQでロールバックされるとどうなりますか?

私は同じことをする際に問題はありません。メッセージはどうなりますか?キューの一番下に行くのですか?

私がキューからメッセージをプルしようとすると、私は同じメッセージをロールバックすることになりますか?

どのような動作が発生する可能性がありますか?大量のキューシナリオでこの動作を一般的に知りたいですか?

任意の入力を理解してください。

おかげで、 Manglu

答えて

5

トランザクションはトランザクションの開始前に、キューとメッセージはそれがなかっただけのように表示されます解決し、その後の後、あなたは、トランザクションの範囲内でキュー操作を行っている、とロールバックが発生した場合。言い換えれば、全く変化はありません。

大量のシナリオでは、単一のキューに複数のトランザクション・リーダーと複数のライターを持つのが一般的ですが、デキューまたはエンキューごとにキュー全体をロックしません。

これらのリーダーとライターは、運命のトランザクションが解決している間、アイテムをキューに挿入するか、キューからアイテムをキューにデキューします。その場合、他のキューアイテムが表示されたり消えたりすることがあります(またはその両方)。

元のトランザクションのロールバック後に、再度キューからデキューすると、may元のメッセージが表示されることがあります。大量で並列性の高いシナリオでは、コードで実行できるようになる前に別のリーダーがメッセージを取り込んでしまう可能性があります。

3

ロールバックはメッセージをキューに残し、再配信のためにそれを表示します。

ただし、(再構成可能な)再配信の制限に達すると、メッセージは「デッドレターキュー」に置かれます。

典型的な例は、sc.cです。 'poison messages':基本的で非一時的な問題(無効なフォーマット、欠落したフィールドなど)のために対処できないメッセージ。

ロールバックする前に(メッセージをキューに戻す前に)、エラーが一時的かどうか(バックエンドへの接続が壊れているかどうかなど)を確認してください。

後者の場合、メッセージを飲み込んでエラーを記録するか、他の警告を発するのが最善です。それ以外の場合、メッセージは処理能力とキューインフラストラクチャの両方を不必要に消費します。

HTH

ガイ

+0

マルク、 私の理解では、バックアウトしきい値に達した後、メッセージを指定のデッドレターキューにバックアウトキューずに送信されていることです。メッセージがBOQに書き込まれない場合にのみDLQに送信されます。 Manglu – Manglu

3

はこのスレッドから特定のポイントのカップルに答えるために...

  • メッセージは、キュー内の位置です保持します。同期点の下のGETはメッセージをロックしますが、メッセージをキューから削除したり、メッセージの位置を変更することはありません。ロールバックによりロックが解除され、メッセージが再配信可能になります。
  • ポイズンメッセージの自動再キューは、JMSおよびXMSクラスでは発生しますが、Java、C、C#、COBOLなどのネイティブAPIでは発生しません。 JMSまたはXMS(Cおよび.NETプログラム用のJMS APIを実装している)を使用していない場合は、自分でメッセージを再キューする必要があります。
  • BOQTHRESHの再配信を超えた後、入力キューのBOQNAME属性に指定されたキューで再キューティングが試行されることが間違いありません。そのキューが使用できない場合(完全、無許可、存在しないなど)、DLQが試行されます。それが失敗すると、メッセージリスナーはメッセージの受信を停止します。
  • プログラムは、強制的にメッセージを再キューし、例外キュー内のメッセージの存在を警告することで、有害なメッセージを処理することが理想的です。それに失敗しても、少なくともメッセージを消費して破棄しないでください。それをメッセージヘッダーと一緒に記録して、後で誰かがそれに起こったことを調整することができます。
関連する問題