============================================================================
原创作品,允许转载。转载时请务必以超链接形式标明原始出处、以及本声明。
请注明转自: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,这样就可以保证所有的消息都是按照优先级来消费的。
本文介绍如何将ActiveMQ配置为优先级队列,并针对长时间任务的特点进行优化,确保消息按照优先级消费,避免慢消费者问题。
822

被折叠的 条评论
为什么被折叠?



