6

I receive a message from a WebSPhere MQ queue. I try to process and if i receive some exceptions i want to rollback the message to the MQ Queue.

I have no problems in doing the same. What happens to the message? Does it go to the bottom of the queue?

If i try and pull a message from the queue would i receive the same message that i rolledback?

What is the behaviour likely to be? I want to know this behaviour typically in a high volume Queue scenario?

Appreciate any inputs.

Thanks, Manglu

4

3 に答える 3

5

ロールバックは、メッセージをキューに残し、再配信に備えます。

ただし、再配信試行の (構成可能な) 制限に達すると、メッセージは「配信不能キュー」に入れられます。

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

そのため、ロールバック (およびメッセージをキューに戻す) する前に、エラーが一時的なもの (バックエンドへの接続が切断されているなど) であるかどうかを確認してください。

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

HTH

于 2009-06-02T20:17:57.613 に答える
4

このスレッドからの特定のポイントのいくつかに答えるには...

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