我想弄清楚如何与并发使用者一起使用消息驱动通道适配器,并能够承受系统故障而不会丢失任何消息。在我当前的实现中,我使用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"
/>
但是由于现在涉及多个并发使用者,因此现在重新定义了事务边界,如果发生故障,则会丢失消息。
我的主要问题是我需要多个使用者来提供消息,并且同时我不想在崩溃事件期间丢失消息。有没有办法扩展/传播事务边界,或者至少在流程结束时手动确认每个消息?
我认为你误解了一些东西,只是感到困惑。并发不会中断事务:每个并发使用者都拥有自己的事务,并且如果消息处理是在同一线程中完成的,则不会丢失任何消息。
我认为你将消息放置到下游某处的其他线程中。那就是你的TX提交的地方,如果发生错误,消息可能会丢失。
你需要修改处理消息的方式,以使消息保持在tx边界内,或者真正考虑使用client
ack模式在下游手动执行此操作。
感谢您的答复,我确实在应用程序崩溃时丢失消息时遇到了一个问题,并且给人一种印象,即并发用户类似于使用带有任务执行者的通道,因此会丢失事务性。如果我可以有多个使用此配置的使用者并且不丢失事务语义,那么我很好!
如果丢失消息,则与JMS使用者并发及其事务性质无关。