activemq完全优先级队列的设置以及使用
程序员文章站
2022-06-14 08:44:10
...
============================================================================
原创作品,允许转载。转载时请务必以超链接形式标明原始出处、以及本声明。
请注明转自:http://yunjianfei.iteye.com/blog/
============================================================================
最近有个需求是要使用activeMQ作为一个完全优先级队列,且里面的任务都是耗时很长的任务,主要特点如下:
1. 多个producer,多个consumer
2.consumer取来消息后,会去执行一些长时间的任务,期间阻塞consumer
3.没有消费的消息,中间可能会修改优先级
4.优先级高的消息必须先被消费
在使用过程中,发生了一些意外状况,因为长时间的任务,导致activeMQ判定consumer为Slow Consumers 导致在取消息的时候不是完全按照优先级来取消息。解决方案如下:
首先,在activemq.xml中配置,使其支持优先级队列以及针对Slow-Consumer做一些策略。
<destinationPolicy> <policyMap> <policyEntries> <policyEntry queue=">" producerFlowControl="false" prioritizedMessages="true" useCache="false" expireMessagesPeriod="0" queuePrefetch="1" /> <policyEntry queue=">" strictOrderDispatch="false" /> <policyEntry queue=">" > <pendingMessageLimitStrategy> <constantPendingMessageLimitStrategy limit="0"/> </pendingMessageLimitStrategy> <messageEvictionStrategy> <oldestMessageWithLowestPriorityEvictionStrategy/> </messageEvictionStrategy> </policyEntry> </policyEntries> </policyMap> </destinationPolicy>
其次,因为每个消息都是长时间的操作,一定要等消息里的命令完全执行完毕后,再向ActiveMQ发送ACK,这样就可以保证所有的消息都是按照优先级来消费的。