Java Activemq在一段时间后不会平衡消息

Java Activemq在一段时间后不会平衡消息,java,apache-camel,jms,activemq,Java,Apache Camel,Jms,Activemq,我将activemq(5.14.5)与camel(2.13.4)一起使用,因为我仍然需要java6。 我有一个队列和15个消费者。发送给他们的消息是请求-答复 当我启动消费者时,消息一到达,消息就被分发给每个消费者,但是,一段时间后,只有一个消费者收到消息,其他消费者保持空闲,许多消息处于挂起状态 使用者具有以下配置: concurrentConsumers=15&maxMessagesPerTask=1&destination.consumer.prefetchSize=0&a

我将
activemq(5.14.5)
camel(2.13.4)
一起使用,因为我仍然需要
java6
。 我有一个队列和15个消费者。发送给他们的消息是请求-答复

当我启动消费者时,消息一到达,消息就被分发给每个消费者,但是,一段时间后,只有一个消费者收到消息,其他消费者保持空闲,许多消息处于挂起状态

使用者具有以下配置:

concurrentConsumers=15&maxMessagesPerTask=1&destination.consumer.prefetchSize=0&transferException=true
由于我们的业务规则,处理每条消息所花费的时间可能会有很大的不同,因此,我不知道
activemq
是否有一些规则可以管理速度较慢的使用者,并只重定向到更“高效”的使用者

我所期望的行为是,所有到达的消息都开始处理,直到所有的消费者都满了为止,但事实并非如此

有人知道发生了什么吗

以下是正在发生的事情的图片:

您的配置有两个引人注目的设置:

  • maxMessagesPerTask=1
  • 如果不打算配置自动缩放线程池,则应完全删除此设置。默认情况下是无限制的,它设置线程的处理时间(向上/向下扩展线程池)

    另见

  • prefetchSize=0
  • 您是否尝试过将此设置为1,以便每个消费者一次只收到一条消息

    有关预取大小的说明:

    建议使用较大的预取值以实现高性能和高消息量。但是,对于较低的消息量,处理每条消息需要较长时间,则应将预回迁设置为1。这样可以确保消费者一次只处理一条消息。但是,将预回迁限制指定为零将导致使用者轮询消息,一次轮询一条,而不是将消息推送到使用者


    嗨,这是maxMessagesPertask,因为我在使用自动缩放。为了解决这个问题,我把它关掉了。对不起,我的错误是留下了这个参数。我尝试了prefetchSize=1,但也不起作用。我知道prefetchSize=1会使使用者在处理另一条消息时仍然缓存一条消息。这对我来说是个问题,因为这个过程需要很长时间,而消息挂起对我来说是个问题。我的理解正确吗?我可以再试一次完美尺寸1。对不起,关于预取尺寸,您是对的。到目前为止,我从未看到它的值为0,我误解了文档。有。我在你的截图中看到你使用了选择器。是否可以使用相同的选项启动消费者,但不使用选择器,并检查消息分布是否更好?是的,我认为我们可以在不同的activemqs中拆分队列,生产者将重定向消息,以便我可以删除选择器。另一个建议是您提到的问题中的解决方法。更改maxPageSize。我今天在activemq中添加了policyEntry maxPageSize。现在是时候等待并检查它是否有效了。我会通知你的。