activemq通配符使用者如何工作?

blo*_*lob 5 java queue activemq-classic dispatch

我将ActiveMQ 5.8与在骆驼路线中配置的通配符使用者一起使用。

我正在使用默认的ActiveMQ配置,因此我具有以下默认值

prefetch = 1
dispatch policy= Round Robin
Run Code Online (Sandbox Code Playgroud)

现在,我启动了一个消费者jvm,其中每个队列有5个消费者。两个队列具有相同类型的消息和相同数量的消息。

消费者除了打印消息外什么都不做(因此没有数据库阻塞或缓慢的消费者问题)

编辑 我已将每个队列的preFetch设置为1

我观察到的是,一个队列比另一个队列更快地耗尽了资源。

我期望的是队列以相同的速度耗尽,这是一种负载平衡。

一个令人惊讶的发现是,尽管activemq Webconsole显示每个队列有5个使用者

在此处输入图片说明

调试使用者时,我仅从骆驼流中看到5个线程/使用者的通配符队列* .processQueue 在此处输入图片说明

上述行为的原因是什么?如何确保所有队列以相同的速度消耗?

是否有人在编写自定义调度策略或覆盖activemq的默认设置方面有经验可共享?

blo*_*lob 2

我能够找到对此行为的参考

通配符队列消费者的消息分发是随机的。

http://activemq.2283324.n4.nabble.com/Wildcard-and-message-distribution-td2346132.html#a2346133

尽管这可以通过设置适当的预取大小来调整。

经过反复试验,我得出了以下公式,在消费者之间公平分配,并且所有队列以几乎相同的速度出队。

prefetch = number of wildcard consumers
Run Code Online (Sandbox Code Playgroud)