Java JMS使用者阻止其他JMSxGroup

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

我试图弄清楚,当消息回滚到队列时,是否有任何方法可以影响消费者的消息处理顺序。 下面我有一些简单的代码,可以帮助我重现这个问题。 我只是将消息按一定顺序推送到具有不同JMSxGroupID的队列上:

  • “A1”(JMSXGroupId:1)
  • “B1”(JMSXGroupId:2)
  • “A2”(JMSXGroupId:1)
  • “C1”(JMSXGroupId:3)
  • “B2”(JMSXGroupId:2)
  • 代码进行A1回滚(它最初重试消息3次),然后延迟返回队列。然而,消费者随后等待,直到它能够再次拾取A1(在等待延迟的时间量之后),这意味着B1和C1组被阻塞在A1之后,并且永远不会得到处理

    理想情况下,我所希望的是,当A1被放回队列并被告知等待时,消费者会选择B1和C1。。。我最终要做的是阻止一个JMSX组在一个消费者上阻塞其他组。另外,可能值得补充的是,我需要保持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的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有什么建议吗