具有并发消费者的 Jms 消息驱动通道适配器避免在崩溃期间丢失消息

Jms message-driven-channel-adapter with concurrent consumers avoid losing messages during crash

我正在尝试弄清楚如何将消息驱动的通道适配器与并发消费者一起使用并成为 能够承受系统故障而不丢失任何消息。 在我当前的实现中,我使用 Spring 集成并从 ArtemisMQ 服务器读取,我需要能够回滚任何未能到达流程末尾的消息。

我确实使用以下实现来接收消息

  <int-jms:message-driven-channel-adapter
            connection-factory="connectionFactory"
            destination="myQueue"
            message-converter="messageConverter"
            channel="inputChannel"
            concurrent-consumers="5"
            error-channel="errorChannel"
            acknowledge="transacted"
    />

但由于现在涉及多个并发消费者,现在重新定义了事务边界,如果发生故障,则消息将丢失。

我的主要问题是我需要多个消费者提供消息,同时我不想在崩溃事件中丢失消息。有没有办法 extend/propagate 交易边界或至少手动确认每条消息 在我的流程结束时?

我想你误会了什么,只是感到困惑。并发不会破坏事务:每个并发消费者都有自己的事务,如果消息处理在同一线程中完成,则不会丢失任何内容。

我认为您向下游某处的不同线程发送了一条消息。那是你的 tx 提交的地方,如果发生错误,消息可能会丢失。

您需要修改处理消息的方式以将它们保持在 tx 边界内,或者真正考虑使用 client ack 模式在下游手动执行此操作。