0

MQQueueSession.rollback()を使用して作業単位をロールバックしています。メッセージはBACKOUTキューに移動されます。これで問題ありません。

問題は、これらのメッセージをバックアウトキューでどのように処理するかです。runmqdlqツールを使用できることを読みましたが、MQDLHで始まるメッセージでのみ機能します。単純なMQQueueSession.rollback()はそれを行っていないようです。私は何が間違っているのですか?

コードサンプル:

MQQueueConnection connection;
// ...
MQQueueSession session = (MQQueueSession) connection.createQueueSession(true, Session.SESSION_TRANSACTED);
MQQueue queue = (MQQueue) session.createQueue("queue:///TEST");
MQQueueReceiver receiver = (MQQueueReceiver) session.createReceiver(queue);
JMSTextMessage message = null;

try {
    message = (JMSTextMessage) receiver.receive();
    // ...
    session.commit();
} catch (JMSException e) {
    session.rollback();
    e.printStackTrace();
}
4

1 に答える 1

3

メッセージは、いくつかの理由でMQJMSプロバイダーによってバックアウトキューまたはデッドレターキューにバックアウトされる可能性があります。それらのいくつかは

1)不適切な形式のメッセージ2)トランザクションセッションまたはクライアント確認済みセッション
のいずれかでを実行しても、クライアントアプリケーションによって確認されないメッセージ。このような場合、メッセージは再配信されます。同じものが何度も配信される場合、MQ JMSプロバイダーは、キューの設定に基づいて、そのメッセージをバックアウトキューに移動します。CommitMessage.Acknowledge()BOTHRESH

上記は「ポイズンメッセージ」処理と呼ばれます。

多くの場合、キューにはバックアウトキュー(BOQUEUE)が定義されていない場合があります。このような場合、MQ JMSプロバイダーは、ポイズンメッセージをDLQDLQヘッダーの前にあるデッドレターキュー()に移動します。runmqdlqでメッセージを処理するために使用できますDLQ

バックアウトキュー内のメッセージには、のようなヘッダーが前に付けられていませんDLQ。メッセージがそこに到達する理由を調査する必要があります。理由を修正し、メッセージを元のキューに戻して、メッセージをアプリケーションに配信できるようにします。

于 2012-12-21T16:49:31.457 に答える