5

受信ゲートウェイ:

<int-http:inbound-gateway   id="inbound.gateway"
                            request-channel="transactional.channel.input"
                            reply-channel="channel.output"
                            error-channel="channel.error"
                            request-payload-type="java.lang.String"
</int-http:inbound-gateway>

アドバイスの定義:

<tx:advice id="advice">
    <tx:attributes>
        <tx:method name="send" propagation="REQUIRES_NEW" rollback-for="MyClassException"/>
    </tx:attributes>
</tx:advice>

アドバイス構成:

<aop:config>
    <aop:advisor advice-ref="advice" pointcut="bean(transactional.channel.input)"/>
</aop:config>

トランザクションである必要があるチェーン:

<int:chain input-channel="transactional.channel.input" output-channel="non.transactional.channel.input>
    <int:service-activator ref="v1.registerUser.service" method="registerUser"/>
    <int:service-activator ref="v1.saveObject.service" method="saveObject"/>
</int:chain>

最後のトランザクション チェーン ステップで生成されたオブジェクト ID を取得するために、トランザクションを事前に実行する必要があるチェーン:

<int:chain input-channel="non.transactional.channel.input" output-channel="channel.output">
    <int:service-activator  ref="v1.getObjectId.service" method="getObjectId"/>
    <int:object-to-json-transformer/>
</int:chain>

この単純化されたコンテキストを使用すると、getObjectId サービスで id にアクセスすると、トランザクションは実行されませんでした。

そのため、トランザクションは受信ゲートウェイの出力レベルでコミットされているようです。

4

2 に答える 2

9

Java コードをまったく書かないもう 1 つの驚くべきトリック:

<channel id="input"/>

<aop:config>
    <aop:advisor advice-ref="txAdvice" pointcut="bean(input)"/>
</aop:config>

<tx:advice id="txAdvice">
    <tx:attributes>
     <tx:method name="send"/>
    </tx:attributes>
</tx:advice>

これにより、すべての直接シングルスレッド メッセージ フローが、チャネル入力に送信されるメッセージの TX にラップされます。

于 2013-09-20T10:22:40.633 に答える