简体   繁体   中英

Right way to use transactional and request-handler-advice-chain in a JPAOutboundGateway

I've got for a JPA Outbound-channel-adapter both transactional and request-handler-advice-chain. In the advice-chain I try to log the Exception, when it happens. It iss not logged, but I know that it actually happend since the Message was sent to failover clickDbFailoverChannel . What can be a problem with it? Is it a bug in 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>

OK. I can guess where is your issue. The real exception to rollback the transaction is caused before an internal logic, where <request-handler-advice-chain> does the stuff. That's why your ExpressionEvaluatingRequestHandlerAdvice doesn't get a failure message.

To workaround your rollback issue, you should replace <int-jpa:transactional> with <tx:advice> within <int-jpa:request-handler-advice-chain> .

You should understand here that <int-jpa:transactional> is for entire MessageHandler.handleMessage , but <int-jpa:request-handler-advice-chain> is just for its part - AbstractReplyProducingMessageHandler.handleRequestMessage .

UPDATE

TX Advice should be like this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM