gpt4 book ai didi

java - JMS 消费者阻止其他 JMSXGroups

转载 作者:行者123 更新时间:2023-12-04 01:49:13 25 4
gpt4 key购买 nike

我正在尝试弄清楚当消息回滚到队列时是否可以影响消费者的消息处理顺序。我在下面有一些简单的代码可以帮助我重现该问题。我只是按特定顺序将消息推送到具有不同 JMSXGroupId 的队列中:

  1. “A1”(JMSXGroupId:1)
  2. “B1”(JMSXGroupId:2)
  3. “A2”(JMSXGroupId:1)
  4. “C1”(JMSXGroupId:3)
  5. “B2”(JMSXGroupId:2)

代码使 A1 回滚(它最初重试消息 3 次)并延迟返回到队列。然而,消费者然后等待它可以再次拿起 A1(在等待延迟的时间之后),这意味着 B1 和 C1 组被阻塞在 A1 后面并且永远不会被处理。

理想情况下,我希望的是当 A1 被放回队列并被告知等待时,消费者会选择 B1 和 C1...我最终想要做的是阻止一个 JMSXGroup 阻塞其他在消费者身上。此外,可能值得补充的是,我需要保持 A (A1、A2、A3...) 的消息序列顺序,并希望通过将它们留在队列中来做到这一点,而不是必须为异常构建一些管理解决方案。

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 的 Apache Camel 微服务和事务路由。没什么特别的,但如果需要,我可以提供更多详细信息/配置详细信息。

提前致谢

最佳答案

队列上的严格排序必然会遇到这样的问题,因为队列必须遵守其基本的先进先出(即 FIFO)语义。即使在 A1 失败后立即拾取 B1,您也必须等到消费 A2 直到 A1 被消费以保持顺序,并且由于队列必须被消费 FIFO,这将阻止消费 C1 和任何其他消息在它后面。

关于java - JMS 消费者阻止其他 JMSXGroups,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54095563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com