假设我有一个基本的Spring Integration流程,例如:
<jms:inbound-channel-adapter>
<poller>
<transactional/>
</poller>
</jms:inbound-channel-adapter>
<some:outbound-channel-adapter/>
如果出站适配器抛出异常,则会回滚整个事务。
如果入站消息子系统支持该消息,则该消息将被重新发送多次,直到最终将其发布到“死信队列”中为止。很好-除了丢失异常本身之外,从诊断的角度来看,异常非常烦人。
如果我使用错误通道配置入站适配器,例如:
<jms:inbound-channel-adapter>
<poller error-channel="myErrorChannel" >
<transactional/>
</poller>
</jms:inbound-channel-adapter>
<some:outbound-channel-adapter/>
那么该异常将被捕获,并成为myErrorChannel上消息有效负载的一部分。然后,我可以读取消息并将异常的堆栈跟踪记录保留到日志中以进行诊断-但要付出一定的代价-入站适配器上的事务不再回滚并且原始消息丢失了-除非我也保存了它作为错误处理的一部分。
但是,如果保留异常或原始消息也失败怎么办?我想如果myErrorChannel是直接通道,则整个事务将再次回滚,最终该消息最终将出现在Dead Letter Queue上。而且,堆栈跟踪将再次丢失。
处理这些问题的最佳实践是什么?
实际上,您的做法正确,但是在将交易记录到您的帐户后,您必须手动回滚交易errorHandler
:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
仅此而已:无需保留消息,也不必担心那里的其他副作用。
当然,您myErrorChannel
必须是direct
在同一个事务线程中进行日志记录和回滚的渠道。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句