JMS でのトランザクションの処理

JMS のトランザクション接続により、実際にはトランザクションがコミットされたときにのみ実行される一連の操作を実行できます。主な 2 つのシナリオは次のとおりです。

  • トランザクションの一環でメッセージをパブリッシュする: publish を実行するときに、メッセージはトランザクションが​コミット​されたときに効果的に宛先に送信されます。何らかの理由でトランザクションが失敗して​ロールバック​が発生すると、メッセージは送信されません。

  • トランザクションの一環でメッセージをコンシュームする: メッセージをコンシュームする場合、listener または consume を使用してメッセージが肯定応答されるのは​トランザクションがコミットされた後のみ​であり、トランザクションが​ロールバック​された場合は代わりに再配信のために宛先に返されます。

JMS コネクタは、Mule の transactionalAction 設定を使用した設定不要なトランザクション的手法でのその操作の実行をサポートしています。

トランザクションの一環で操作を実行するには、次の 2 つのオプションがあります。

新規メッセージのトランザクションセッションでの処理

メッセージをディスパッチするときに JMS リスナでトランザクションセッションを使用するには、transactionalAction を 'ALWAYS_BEGIN' に設定する必要があります。

<jms:listener config-ref="JMS_Config" destination="${originQueue}" transactionalAction="ALWAYS_BEGIN"/>

この設定により、新しいメッセージはそれぞれフローのすべてのコンポーネントに伝播されるトランザクションで処理され、フロー実行が正常に完了したときにコミットされます。フロー実行が完了したがエラーが発生した場合、トランザクションはロールバックされます。

デフォルトでは、フローの​他のコンポーネント​はリスナによって作成された​トランザクションに参加しません​。リスナのトランザクションを使用して他の操作を実行するには、'ALWAYS_JOIN' または 'JOIN_IF_POSSIBLE' を使用して宣言する必要があります。

トランザクションの一部としての操作の実行

トランザクションの一環で publishconsume などの操作を実行するには、transactionalAction を 'ALWAYS_JOIN' または 'JOIN_IF_POSSIBLE' に設定する必要があります。

このように設定した操作は、リスナが開始するトランザクションの一部となります。

<flow name="joiningToListenerTransaction">
    <jms:listener config-ref="JMS_Config" destination="${originQueue}" transactionalAction="ALWAYS_BEGIN"/>
    <jms:publish config-ref="JMS_Config" destination="#[attributes.properties.userProperties.redirectDestination]" transactionalAction="JOIN_IF_POSSIBLE"/>
    <jms:consume config-ref="JMS_Config" destination="#[attributes.properties.userProperties.callbackDestination]" transactionalAction="JOIN_IF_POSSIBLE"/>
</flow>

または、スコープの絞られたトランザクションに参加できます。

<flow name="nonTxPublishMustNotJoinCurrentTx">
    <http:listener config-ref="HTTP_Config" path="/orders"/>
    <try transactionalAction="ALWAYS_BEGIN">
        <jms:publish config-ref="config" destination="${billingService}" transactionalAction="ALWAYS_JOIN"/>
        <jms:publish config-ref="config" destination="${shipmentService}" transactionalAction="ALWAYS_JOIN"/>
        <jms:publish-consume config-ref="JMS_Config" destination="${invoicesVerificationService}"/>
        <validation:is-true expression="#[payload]"/>
    </try>
</flow>

Was this article helpful?

💙 Thanks for your feedback!

Edit on GitHub