【问题标题】:Jms message-driven-channel-adapter with concurrent consumers avoid losing messages during crash具有并发消费者的 Jms 消息驱动通道适配器避免在崩溃期间丢失消息
【发布时间】:2020-12-08 12:00:31
【问题描述】:

我正在尝试弄清楚如何将消息驱动通道适配器与并发消费者一起使用并成为 能够承受系统故障而不会丢失任何消息。 在我当前的实现中,我使用 Spring Integration 并从 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"
    />

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

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

【问题讨论】:

    标签: spring-integration


    【解决方案1】:

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

    我认为您将消息发送到下游某处的不同线程。这就是你的 tx 被提交的地方,如果出现错误,消息可能会丢失。

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

    【讨论】:

    • 感谢您的回复,当应用程序崩溃时,我确实遇到了丢失消息的问题,并且我的印象是并发消费者类似于使用带有任务执行器的通道,因此会出现丢失消息的问题交易性。如果我可以有多个使用这种配置的消费者并且不会丢失事务语义,那么我很好!
    • 如果您丢失了消息,那么它与 JMS 消费者并发及其事务性质无关。
    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 2015-09-10
    • 2017-04-29
    • 2016-11-18
    相关资源
    最近更新 更多