59.12. トランザクションサポート

Camel 2.19 以降で利用可能

Camel CDI は、JTA を使用して Camel トランザクションクライアントをサポートします。

このサポートはオプションであるため、アプリケーションのクラスパスに JTA を含める必要があります。たとえば、Maven を使用するときに JTA を依存関係として明示的に追加します。

<dependency>
    <groupId>javax.transaction</groupId>
    <artifactId>javax.transaction-api</artifactId>
    <scope>runtime</scope>
</dependency>

アプリケーションを JTA 対応コンテナーにデプロイするか、スタンドアロンの JTA 実装を提供する必要があります。

注意

当面の間、トランザクションマネージャーは java:/TransactionManager キーで JNDI リソースとしてルックアップされることに注意してください。

より幅広いデプロイメントシナリオをサポートするために、より柔軟なストラテジーが将来追加される予定です。

59.12.1. トランザクションポリシー

Camel CDI は、通常サポートされる Camel TransactedPolicy の実装を CDI Bean として提供します。これらのポリシーは、処理された EIP を使用して名前で検索することができます。たとえば、次のようになります。

class MyRouteBean extends RouteBuilder {

    @Override
    public void configure() {
        from("activemq:queue:foo")
            .transacted("PROPAGATION_REQUIRED")
            .bean("transformer")
            .to("jpa:my.application.entity.Bar")
            .log("${body.id} inserted");
    }
}

これは次と同等です。

class MyRouteBean extends RouteBuilder {

    @Inject
    @Named("PROPAGATION_REQUIRED")
    Policy required;

    @Override
    public void configure() {
        from("activemq:queue:foo")
            .policy(required)
            .bean("transformer")
            .to("jpa:my.application.entity.Bar")
            .log("${body.id} inserted");
    }
}

サポートされているトランザクションポリシー名のリストは次のとおりです。

  • PROPAGATION_NEVER,
  • PROPAGATION_NOT_SUPPORTED,
  • PROPAGATION_SUPPORTS,
  • PROPAGATION_REQUIRED,
  • PROPAGATION_REQUIRES_NEW,
  • PROPAGATION_NESTED,
  • PROPAGATION_MANDATORY.

59.12.2. トランザクションエラーハンドラー

Camel CDI は、再配信エラーハンドラーを拡張するトランザクションエラーハンドラーを提供し、例外が発生するたびにロールバックを強制し、再配信ごとに新しいトランザクションを作成します。

Camel CDI は、transactionErrorHandler ヘルパーメソッドを公開する CdiRouteBuilder クラスを提供して、設定への迅速なアクセスを可能にします。

class MyRouteBean extends CdiRouteBuilder {

    @Override
    public void configure() {
        errorHandler(transactionErrorHandler()
            .setTransactionPolicy("PROPAGATION_SUPPORTS")
            .maximumRedeliveries(5)
            .maximumRedeliveryDelay(5000)
            .collisionAvoidancePercent(10)
            .backOffMultiplier(1.5));
    }
}