【问题标题】:Transactional message-driven-channel-adapter事务性消息驱动通道适配器
【发布时间】:2014-12-05 15:51:46
【问题描述】:

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

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

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

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

非常感谢

【问题讨论】:

    标签: spring-integration


    【解决方案1】:

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

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

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

    无法控制哪个消费者将获得重新交付。

    在您的 JMS 代理上配置重试、DLQ 等。

    编辑:

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

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

    【讨论】:

    • 谢谢加里,这很有帮助。只要 JDBC 事务控制处理就足够了,因为系统无论如何都设计为处理重复消息。
    • 添加了一些说明 - 我不确定 Stack Overflow 是否会通知提问者有关答案的编辑。
    • 再次感谢,我将按照说明对其进行测试,希望它会起作用。
    猜你喜欢
    • 2016-11-18
    • 2014-01-23
    • 2011-04-29
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多