所以设置是以下几点:Spring集成和JDBC在单个事务
<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过程-amqpOUT shold在单个线程执行)我扔ListenerExecutionFailedException期间, dataSourceTransactionManager将执行提交,但是amqp也会重传消息,因为异常会被传播。
在这种情况下,我如何告诉兔子确认信息成功?
此外,我看到我必须放入不回滚 - 属性实际的异常类,因为我的内部异常只存储在未由RuleBasedTransactionAttribute检查的“cause”属性中。
还有一两件事,如果我的配置是这样的:
<int-amqp:inbound-channel-adapter channel="input-channel" queue-names="probni" message-converter="jsonMessageConverter"
channel-transacted="true"
transaction-manager="dataSourceTransactionManager"
transaction-attribute="transactionAttribute" />
transactionAttribute这是RuleBasedTransactionAttribute完全不考虑和DataSourceTransactionManager对象总是rollbacked即使我有没有回滚的正确设置。
谢谢!
您不需要包装异常;看我的编辑。另外,你可以使用'error-handler'属性。 –
感谢您的快速回复。明天会试试这个。如果我做rejectAndDontRequeue - 这会在DeadLetterQueue中结束吗?我希望这被视为普通的ACK,因为我想这样做,以防止消息被重新传递(至少传递一次+可能更多)。顺便说一下,您还知道,为什么事务属性在内部通道绑定器中提供时无法处理事务,但是如果作为建议来应用,它的工作原理是什么? (问题的第二部分)。 –
这就是说,如果消息被重新传递,但jdbc已经被提交,我想抛出一个异常,它将回滚jdbc,但是ack rabbit消息(因为我在处理管道末尾提交并确认)。 –