Warm tip: This article is reproduced from serverfault.com, please click

spring integration-具有并发使用者的Jms消息驱动通道适配器可避免崩溃时丢失消息

(spring integration - Jms message-driven-channel-adapter with concurrent consumers avoid losing messages during crash)

发布于 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"
    />

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

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

Questioner
ypanag
Viewed
11
Artem Bilan 2020-12-08 21:56:33

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

我认为你将消息放置到下游某处的其他线程中。那就是你的TX提交的地方,如果发生错误,消息可能会丢失。

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