在JPAOutboundGateway中使用transactional和request-handler-advice-chain的正确方法

时间:2014-07-24 13:59:46

标签: spring-integration

我有一个JPA Outbound-channel-adapter,包括transactional和request-handler-advice-chain。在建议链中,我尝试记录异常,当它发生时。 它没有记录,但我知道它实际上发生了,因为消息被发送到故障转移clickDbFailoverChannel。它可能有什么问题?这是Spring Integration中的一个错误吗?

<int:channel id="clickDbWithFailoverChannelSite-1">
     <int:dispatcher load-balancer="none" task-executor="clickDbSiteRouterExecutor"/>
</int:channel>
<int:bridge input-channel="clickDbWithFailoverChannelSite-1"
     output-channel="jpaOutboundChannelSite-1" order="1" send-timeout="100" />
<int:bridge input-channel="clickDbWithFailoverChannelSite-1"
     output-channel="clickDbFailoverChannel" order="2" />
<int-jpa:outbound-channel-adapter id="jpaOutboundChannelSite-1"
     persist-mode="PERSIST" flush-size="100" entity-manager-factory="emfSite-1">
    <int-jpa:transactional transaction-manager="transactionManagerSite-1" />
    <int-jpa:request-handler-advice-chain>
        <bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
            <property name="failureChannel" ref="clickDbFailureLogger"/>
            <property name="onFailureExpression" value="#exception"/>
        </bean>
    </int-jpa:request-handler-advice-chain>
</int-jpa:outbound-channel-adapter>

1 个答案:

答案 0 :(得分:0)

行。我猜你的问题在哪里。回滚事务的真正例外是在内部逻辑之前引起的,<request-handler-advice-chain>执行这些操作。这就是为什么你的ExpressionEvaluatingRequestHandlerAdvice没有收到失败的消息。

要解决您的回滚问题,您应该将<int-jpa:transactional>替换为<tx:advice>中的<int-jpa:request-handler-advice-chain>

您应该在此理解<int-jpa:transactional>适用于整个MessageHandler.handleMessage,但<int-jpa:request-handler-advice-chain>只适用于其中AbstractReplyProducingMessageHandler.handleRequestMessage

<强>更新

TX建议应该是这样的:

 <tx:advice transaction-manager="transactionManagerSite-1"/>
        <tx:attributes>
            <tx:method name="*"/>
        </tx:attributes>
</tx:advice>