我有一个情况,我有一个activemq代理与2个队列,Q1和Q2。我有两个使用activemessaging的基于ruby的消费者。我们称他们为C1和C2。两个消费者都订阅每个队列。订阅每个队列时,我将activemq.prefetchSize设置为1。我也设置了ack =客户端。activemeqaging与跺脚和activemq.prefetchSize = 1
考虑事件的序列如下:
1)触发一个长时间运行的工作被发布到队列Q1的消息。称这个M1。
2)M1发送给消费者C1,开始长时间的操作。
3)两条触发短作业的消息被发布到队列Q2。称这些M2和M3。
4)M2被派遣到C2快速运行短期工作。
5)即使C1仍在运行M1,M3仍被分派到C1。它能够分派到C1,因为在队列订阅上设置了prefetchSize = 1,而不是在连接上。所以Q1消息已经被分派的事实并不会阻止一个Q2消息被分派。
由于主动消费者是单线程的,最终结果是M3坐在C1上等待很长时间直到C1完成处理M1。所以,尽管事实上消费者C2处于空闲状态(因为它很快完成了消息M2),所以M3不被处理很长一段时间。
从本质上讲,无论什么时候运行一个长的Q1作业,然后创建了一大堆短的Q2作业,恰好有一个短的Q2作业卡住了等待第一季度作业完成的消费者。
有没有办法在连接级别而不是在订阅级别设置prefetchSize?我真的不希望在处理M1时向C1发送任何消息。另一种选择是我可以创建一个专门处理Q1的消费者,然后让其他消费者致力于处理Q2。但是,由于Q1消息不多,我宁愿不这样做 - Q1的专门消费者会在一天的大部分时间内闲置以占用内存。
感谢您的回复。我们使用处理器组来区分高优先级和低优先级作业。高优先级的工作是由我们的用户界面启动的,低优先级的工作由cron启动。我们可以在这里使用一个处理器组,但是长时间运行的工作实际上每天只能启动一次。我们可以从activemq中完全删除它。对于长期的工作,我们主要是使用activemq进行容错,因为我们在多个服务器上拥有消费者。 – 2010-06-03 23:19:18