JMS Connector でのトランザクションの管理

JMS のトランザクションアクションでは、トランザクションが実行されたときにのみ実行する一連の操作を実行できます。この機能は次の場合に使用します。

  • トランザクションの一部としてメッセージをパブリッシュする
    Publish​ 操作を使用する場合、アプリケーションは、トランザクションの実行後にメッセージを宛先に送信します。何らかの理由でトランザクションが失敗してロールバックが発生すると、メッセージは送信されません。

  • トランザクションの一部としてメッセージをコンシュームする
    On New Message​ ソースまたは ​Consume​ 操作のいずれかを使用する場合、メッセージはトランザクションの実行後にのみ肯定応答されます。トランザクションがロールバックされると、メッセージは再配信のために宛先に返されます。

JMS 用 Anypoint Connector (JMS Connector) では、​[Transactional action (トランザクションアクション)]​ 項目を設定して操作を実行できます。

ソースのトランザクションの設定

メッセージを送信するときに ​On New Message​ ソースでトランザクションアクションを使用する場合、​[Transactional action (トランザクションアクション)]​ 項目を ​ALWAYS_BEGIN​ に設定します。この設定により、それぞれの新規メッセージはトランザクションで処理されます。このトランザクションはフローのすべてのコンポーネントに伝播され、フローの実行が正常に完了した後に実行されます。フローの実行でエラーが返された場合、トランザクションはロールバックされます。

デフォルトでは、フローの他のコンポーネントは ​On New Message​ によって作成されたトランザクションに参加しません。ソーストランザクションを使用して他の操作を実行するには、該当のコンポーネントで ​[Transactional action (トランザクションアクション)]​ 項目を ​ALWAYS_JOIN​ または ​JOIN_IF_POSSIBLE​ に設定します。

次の例では、新規メッセージのトランザクションアクションを設定します。

  1. Studio で、フローから ​[On New Message]​ ソースを選択します。

  2. [Destination (宛先)]​ 項目を ​${originQueue}​ に設定します。

  3. [Advanced (詳細)]​ タブで ​[Transactional action (トランザクションアクション)]​ 項目を ​ALWAYS_BEGIN​ に設定します。

「Advanced (詳細)」 タブで 「Transactional action (トランザクションアクション)」 項目を 「ALWAYS_BEGIN」 に設定する
Figure 1. JMS Connector のトランザクションアクションの設定

XML エディターでは、​<jms:listener>​ および ​transactionalAction​ の設定は次のように記述されます。

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

操作のトランザクションの設定

Publish​ や ​Consume​ などの操作をトランザクションの一部として実行するには、​[Transactional action (トランザクションアクション)]​ 項目を ​ALWAYS_JOIN​ または ​JOIN_IF_POSSIBLE​ に設定します。

次の例では、​On New Message​ ソースにより開始されたトランザクションに参加する ​Publish​ および ​Consume​ 操作を設定します。

  1. [Mule Palette (Mule パレット)]​ ビューで、​[JMS] > [On New Message]​ を選択します。

  2. [On New Message]​ を Studio キャンバスにドラッグします。

  3. [On New Message]​ 設定画面で、​[Destination (宛先)]​ 項目を ​${originQueue}​ に設定します。

  4. [Advanced (詳細)]​ タブで ​[Transactional action (トランザクションアクション)]​ 項目を ​ALWAYS_BEGIN​ に設定します。

  5. [Publish]​ 操作を ​[On New Message]​ ソースの右にドラッグします。

  6. [Destination (宛先)]​ 項目を ​#[attributes.properties.userProperties.redirectDestination]​ に設定します。

  7. [Advanced (詳細)]​ タブで ​[Transactional action (トランザクションアクション)]​ 項目を ​JOIN_IF_POSSIBLE​ に設定します。

  8. [Consume]​ 操作を ​[Publish]​ 操作の右にドラッグします。

  9. [Destination (宛先)]​ 項目を ​#[attributes.properties.userProperties.callbackDestination]​ に設定します。

  10. [Advanced (詳細)]​ タブで ​[Transactional action (トランザクションアクション)]​ 項目を ​JOIN_IF_POSSIBLE​ に設定します。

「Advanced (詳細)」 タブで 「Transactional action (トランザクションアクション)」 項目を 「JOIN_IF_POSSIBLE」 に設定する
Figure 2. JMS Connector の Consume 操作用のトランザクションアクションの設定

XML エディターでは、​transactionalAction​ 設定は次のように記述されます。

<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>

次の例では、Try スコープコンポーネント、JMS の ​Publish​ 操作と ​Publish consume​ 操作、Validation Module の ​Is true​ 操作を使用して、スコープ設定されたトランザクションを設定します。

  1. [Mule Palette (Mule パレット)]​ ビューで、​[HTTP] > [Listener]​ を選択します。

  2. [Listener]​ を Studio キャンバスにドラッグします。

  3. [Listener]​ 設定画面で、​[Path (パス)]​ 項目を ​/orders​ に設定します。

  4. [Try]​ スコープコンポーネントを ​[Listener]​ ソースの右にドラッグします。

  5. [Transactional action (トランザクションアクション)]​ 項目を ​ALWAYS_BEGIN​ に設定します。

  6. JMS の ​[Publish]​ 操作を ​[Try]​ スコープコンポーネントにドラッグします。

  7. [Destination (宛先)]​ 項目を ​${billingService}​ に設定し、​[Transactional action (トランザクションアクション)]​ 項目を ​ALWAYS_JOIN​ に設定します。

  8. JMS の ​[Publish]​ 操作を最初の ​[Publish]​ 操作の右にドラッグします。

  9. [Destination (宛先)]​ 項目を ​${shipmentService}​ に設定し、​[Transactional action (トランザクションアクション)]​ 項目を ​ALWAYS_JOIN​ に設定します。

  10. [Publish consume]​ 操作を 2 番目の ​[Publish]​ 操作の右にドラッグします。

  11. [Destination (宛先)]​ 項目を ​${invoicesVerificationService}​ に設定します。

  12. Validation Module の ​[Is true]​ 操作を ​[Publish consume]​ 操作の右にドラッグします。

  13. [Expression (式)]​ メニューで ​[Expression (式)]​ を選択し、値を ​#[payload]​ に設定します。

XML エディターでは、​transactionalAction​ の設定は次のように記述されます。

<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>