【发布时间】:2017-04-22 17:33:01
【问题描述】:
所以设置如下:
<tx:advice id="txAdvice2" transaction-manager="dataSourceTransactionManager">
<tx:attributes>
<tx:method name="*" rollback-for="Throwable" no-rollback-for="ListenerExecutionFailedException"/>
</tx:attributes>
</tx:advice>
<int-amqp:inbound-channel-adapter channel="input-channel" queue-names="probni" message-converter="jsonMessageConverter"
channel-transacted="true"
advice-chain="txAdvice2" />
<int:chain input-channel="input-channel" output-channel="output-channel">
<int:service-activator ref="h1Handler" method="handle" />
<int:service-activator ref="h2Handler" method="handle" />
<int:service-activator ref="h3Handler" method="handle" />
<int:splitter />
</int:chain>
<int-amqp:outbound-channel-adapter channel="output-channel" exchange-name="outputit" amqp-template="rabbitTemplate" />
如果在这个线程的执行过程中(因为所有这个链 amqpIN-process-amqpOUT shold 在单线程中执行)我抛出 ListenerExecutionFailedException,dataSourceTransactionManager 会做提交,但是 amqp 也会重新排队消息,因为传播了异常。
在这种情况下,我如何告诉rabbit 确认消息成功?
另外,我看到我必须放入 no-rollback-for 属性实际异常类,因为我的内部异常仅存储在 RuleBasedTransactionAttribute 未检查的“原因”属性中。
还有一件事,如果我像这样进行配置:
<int-amqp:inbound-channel-adapter channel="input-channel" queue-names="probni" message-converter="jsonMessageConverter"
channel-transacted="true"
transaction-manager="dataSourceTransactionManager"
transaction-attribute="transactionAttribute" />
根本不考虑作为 RuleBasedTransactionAttribute 的 transactionAttribute,即使我正确设置了 no-rollback-for,也始终回滚 dataSourceTransactionManager。
谢谢!
【问题讨论】:
标签: spring jdbc transactions rabbitmq spring-integration