我们正在尝试在 ActiveMQ 5.9.1 之上构建一个作业队列系统。我们在 activemq 中使用 AMQP 1.0 支持,当前使用 qpid jms 库作为客户端代码。
对于作业队列系统而言,我们可以将 prefetch 设置为 1 至关重要 - 我们希望我们的作业工作者一次只能获得一个任务,竞争消费者模式。qpid 库使用连接工厂定义支持这一点:
connectionfactory.activemq-amqp-manager = amqp://{user}:{password}@{hostname}:{port}?clientid=job-manager&remote-host=default&max-prefetch=1
然而,ActiveMQ 似乎完全忽略了这一点,消费者在 activemq 管理控制台中显示为具有 100 的预取。
进一步挖掘,我找到了来源:org.apache.activemq.transport.amqp.AmqpProtocolConverter
其中包括以下行:
consumerInfo.setPrefetchSize(100);
这是否意味着 AMQP 1.0 协议的 ActiveMQ 支持硬连线了所有客户端的预取值 100?显然这是非常错误的。我们有哪些选择?我们可以切换到纯 JMS 客户端,但会失去语言互操作性。或者我们可以切换到 RabbitMQ,这意味着引入另一个产品来支持(ActiveMQ 已经在其他地方使用)。