事务性消息驱动通道适配器

时间:2014-12-05 15:51:47

标签: spring-integration

我正在使用jms:message-driven-channel-adapter,我需要处理涉及通过多个SI组件处理并最终更新数据库或在某些情况下发送JMS消息的消息。

如何使此消息处理完全是事务性的,这意味着任何错误都应导致消息回滚到JMS队列。我看到你可以在那里拥有一个事务管理器,但是没有看到如何为这种情况配置一个例子。

此外,由于我将并发消费者设置为更高的数字,所以我想了解它在回滚的情况下将如何表现,该消息是否会立即提供给任何其他消费者甚至同一消费者?

由于最有可能另一个消费者也会失败,所以这个消息将继续传递(重试)多少次,如何处理这种情况。

非常感谢

1 个答案:

答案 0 :(得分:1)

设置acknowledge="transacted"并在适配器上配置JDBC事务管理器; JDBC事务将与JMS事务同步。

JDBC tx可能提交并且JMS回滚的可能性很小(例如,如果丢失连接),那么您需要处理重新传递并使代码具有幂等性;否则你需要完整的XA。

有关选项的完整说明,请参阅this article

无法控制哪个消费者将获得重新发送。

在JMS代理上配置了重试,DLQ等。

修改

为了清楚起见,为了使其按照描述工作,消息通道必须是直接通道(或没有任务执行程序的pub-sub),因此下游操作(JMS,JDBC)在侦听器容器的线程上运行。它还假设这些下游操作使用JmsTemplate(与侦听器的连接工厂) - 它将使用侦听器的Session - 或JdbcTemplate与相同的事务管理器。

Spring Integration出站适配器在内部使用这些组件。