メッセージ肯定応答の処理

JMS コネクタによってさまざまな肯定応答設定が提供されます。

成功時の自動肯定応答

AUTO ackModejms:listener コンポーネントで使用し、​フロー実行が正常に完了した場合のみ​受信されたメッセージの自動肯定応答を実行できます。 フロー実行中にエラーが発生して途中で終了した場合、メッセージは肯定応答されず、再配信が実行されます。

AUTO と似たもう一つの ackModeDUPS_OK があります。DUPS_OK を使用すると、フロー実行の成功時にメッセージが自動的に肯定応答されますが、速度は遅く、肯定応答が実行される前にメッセージが再配信される場合があるため、重複が発生する可能性があります。

即時の肯定応答

jms:listener 操作または jms:consume 操作で ackModeIMMEDIATE に設定すると、メッセージがコンシュームされた場合に自動的に、メッセージがアプリケーションによって処理される前に肯定応答されます。 メッセージが受信された場合に自動的に肯定応答されるということは、メッセージの処理中にエラーが発生しても再配信されないため、メッセージを失わずにエラーを処理するにはデッドレターキューなどのアプリケーションロジックを作成する必要があります。

手動肯定応答

予想どおり、MANUAL ackMode によってメッセージで肯定応答を実行するすべての責任がアプリケーションロジックに委譲されます。

この設定では、listener 操作または consume 操作によって受信されたすべてのメッセージの MuleMessage attributesackId が使用でき、これによって指定された接続に対してこのメッセージが一意に識別されます。

続いて、メッセージを識別する ackIdjms:ack 操作に渡されます。

<flow name="consumerWithManualAck">
    <jms:consume config-ref="JMS_config" destination="openTickets" ackMode="MANUAL"/>

    <!--Do message processing-->
    <logger message="#[payload]">

    <jms:ack ackId="#[attributes.ackId]"/>
</flow>

手動セッションリカバリ

MANUAL ackMode を使用すると、受信済みだが肯定応答されていないすべてのメッセージがブローカーによって再配信されなくなります。 メッセージ処理中にエラーが発生して肯定応答できなくなった場合、ユーザが recover-session 操作を使用してセッションで再配信する必要があるすべてのメッセージを手動で回復する責任を負います。

<flow name="consumerWithManualAck">
    <jms:consume config-ref="JMS_config" destination="${destination}"
                 ackMode="MANUAL" target="consumedMessage" targetValue="#[message]"/>

    <!--Do message processing-->
    <logger message="#[payload]">

    <jms:ack ackId="#[vars.consumedMessage.attributes.ackId]"/>

    <error-handler>
        <on-error-propagate>
            <!--In case of error, recover the session-->
            <jms:recover-session ackId="#[vars.consumedMessage.attributes.ackId]"/>
        </on-error-continue>
    </error-handler>
</flow>

前回と同様、セッションを回復するために使用する接続はメッセージを受信するために使用した接続と同じである必要があります。

Was this article helpful?

💙 Thanks for your feedback!