Java JMS使用者阻止其他JMSxGroup
我试图弄清楚,当消息回滚到队列时,是否有任何方法可以影响消费者的消息处理顺序。 下面我有一些简单的代码,可以帮助我重现这个问题。 我只是将消息按一定顺序推送到具有不同JMSxGroupID的队列上:Java JMS使用者阻止其他JMSxGroup,java,spring-boot,apache-camel,jms,Java,Spring Boot,Apache Camel,Jms,我试图弄清楚,当消息回滚到队列时,是否有任何方法可以影响消费者的消息处理顺序。 下面我有一些简单的代码,可以帮助我重现这个问题。 我只是将消息按一定顺序推送到具有不同JMSxGroupID的队列上: “A1”(JMSXGroupId:1) “B1”(JMSXGroupId:2) “A2”(JMSXGroupId:1) “C1”(JMSXGroupId:3) “B2”(JMSXGroupId:2) 代码进行A1回滚(它最初重试消息3次),然后延迟返回队列。然而,消费者随后等待,直到它能够再次拾取A
onException(Exception.class)
.log("Exception Caught !! ")
.redeliveryDelay("1000")
.maximumRedeliveries(3)
.handled(false)
.markRollbackOnly()
.log("log:output");
from("amq:queue:mailbox?concurrentConsumers=1")
.to(logEndpoint)
.process(exchange -> {
if(exchange.getIn().getBody(String.class).contains("A")) {
throw new Exception("Found A");
}
});
我正在使用一个基于Java的ApacheCamel微服务和事务路由。
没有什么特别之处,但如果需要,我可以提供更多细节/配置细节
提前感谢由于队列必须遵循其基本的先进先出(即FIFO)语义,因此队列上的严格排序必然会遇到类似的问题。即使A1失效后B1立即被拾取,您也必须等待A2的消耗,直到A1被消耗,以保持秩序,由于队列必须使用FIFO,这将阻止C1及其后面的任何其他消息的使用。您使用的是Camel的重新传递,它只会调用处理器方法(例如失败的情况下)而不会调用整个路由 您可能希望了解如何使用JMS事务,让消息一直回滚到JMS代理,并在消息代理上配置重新交付设置
如果您有《骆驼行动手册》的副本,那么我建议您阅读交易章节和错误处理章节。您的问题是因为消费者端点上的
concurrentConsumers=1
。如果只有一个使用者,则不可能并行处理JMS组
有了这一限制,您实际上就有了一个用户,JMS组头没有任何作用,因为无论如何只有一个用户来处理消息
JMSXGroupId
头确保具有相同组ID的所有消息都由同一消费者处理。因此,如果您有3个消费者,那么您的示例中的3个组可以并行处理,即使消息A1“阻塞”组A的消费者一段时间
但是,当用户少于组时,当然一条消息会阻止其他组,因为一个用户处理多个组 嗨,burki,我应该说我已经简化了这篇文章的解决方案,但是我已经运行了2个消费者组和6个组(A、B、C、D、E、F-所有三个消息-A1、A2、A3等),仍然看到了相同的问题,这与你的最后一句话很吻合。嗨-我也在同一阶段希望Camel和/或ActiveMQ能为我提供只针对一个JMSXGroupId的阻塞消息,我还希望“通过将它们留在队列中来实现这一点,而不是为异常构建一些管理解决方案。”想知道你是否明白了这一点?为每个JMSXGroupId指定一个消费者并不能满足我的期望:按用户UID分组。tnx有什么建议吗