`
xiaoyu966
  • 浏览: 254844 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

activemq完全优先级队列的设置以及使用

阅读更多

============================================================================

原创作品,允许转载。转载时请务必以超链接形式标明原始出处、以及本声明。

请注明转自: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,这样就可以保证所有的消息都是按照优先级来消费的。

分享到:
评论
1 楼 knightniu 2017-04-10  
请教下   3.没有消费的消息,中间可能会修改优先级 是怎么实现的?

相关推荐

Global site tag (gtag.js) - Google Analytics