我将activemq(5.14.5)
与camel(2.13.4)
一起使用,因为我仍然需要java 6
。
我有一个队列和15个消费者。发送给他们的消息是请求答复。
当我启动使用者时,消息到达后立即在每个使用者中分发一个消息,但是一段时间后,只有一个使用者接收到消息,其他使用者保持空闲,许多消息处于待处理状态。
使用者具有以下配置:
concurrentConsumers=15&maxMessagesPerTask=1&destination.consumer.prefetchSize=0&transferException=true
由于我们的业务规则,处理每条消息所花费的时间可能会相差很大,因此,我不知道activemq
是否具有某些规则来管理速度较慢的使用者并仅重定向到效率更高的一条
我期望的行为是,所有到达的消息都开始处理,直到所有使用者都吃光为止,但这不是正在发生的事情。
有人知道发生了什么事吗?
答案 0 :(得分:1)
您的配置有两个引人注目的设置:
maxMessagesPerTask=1
如果您不想配置自动缩放线程池,则应完全删除此设置。默认情况下,Is是无限制的,它设置保留线程进行处理的时间(按比例放大/缩小线程池)。
另请参见Spring Docs about this setting
prefetchSize=0
您是否尝试过将其设置为1 ,以便每个消费者一次只能收到1条消息?
AMQ docs关于prefetchSize的说法:
建议使用大的预取值,以实现高性能和高消息量。但是,对于较低的消息量,每条消息需要花费很长时间进行处理,因此应将预取设置为1 。这样可以确保使用者一次只处理一条消息。但是,将预取限制指定为零将导致使用者一次轮询一次消息,而不是将消息推送到使用者。