首页 文章

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

提问于
浏览
1

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

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

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

由于最有可能另一个消费者也将失败,因此将继续传递(重试)此消息的次数,如何处理此类情况 .

非常感谢你

1 回答

  • 1

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

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

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

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

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

    EDIT:

    为了清楚起见,为了使其按照描述工作,消息通道必须是直接通道(或没有任务 Actuator 的pub-sub),因此下游操作(JMS,JDBC)在侦听器容器的线程上运行 . 它还假定那些下游操作使用 JmsTemplate (具有侦听器's connection factory) - it will use the listener' s Session - 或具有相同事务管理器的 JdbcTemplate ) .

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

相关问题