欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-14 14:43:02
...

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

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

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