我正在使用jms:message-driven-channel-adapter,我需要处理涉及通过多个SI组件处理并最终更新数据库或在某些情况下发送JMS消息的消息。
如何使此消息处理完全是事务性的,这意味着任何错误都应导致消息回滚到JMS队列。我看到你可以在那里拥有一个事务管理器,但是没有看到如何为这种情况配置一个例子。
此外,由于我将并发消费者设置为更高的数字,所以我想了解它在回滚的情况下将如何表现,该消息是否会立即提供给任何其他消费者甚至同一消费者?
由于最有可能另一个消费者也会失败,所以这个消息将继续传递(重试)多少次,如何处理这种情况。
非常感谢
答案 0 :(得分:1)
设置acknowledge="transacted"
并在适配器上配置JDBC事务管理器; JDBC事务将与JMS事务同步。
JDBC tx可能提交并且JMS回滚的可能性很小(例如,如果丢失连接),那么您需要处理重新传递并使代码具有幂等性;否则你需要完整的XA。
有关选项的完整说明,请参阅this article。
无法控制哪个消费者将获得重新发送。
在JMS代理上配置了重试,DLQ等。
修改强>
为了清楚起见,为了使其按照描述工作,消息通道必须是直接通道(或没有任务执行程序的pub-sub),因此下游操作(JMS,JDBC)在侦听器容器的线程上运行。它还假设这些下游操作使用JmsTemplate
(与侦听器的连接工厂) - 它将使用侦听器的Session
- 或JdbcTemplate
与相同的事务管理器。
Spring Integration出站适配器在内部使用这些组件。