我有一个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>
答案 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>