activemq 关于死信队列的配置应用

来源:互联网 发布:ipone卡通贴图软件 编辑:程序博客网 时间:2024/06/06 18:13

需求场景:


       由于测试环境应用复杂的原因,造成了jms死信队列一直挤压很多数据,从而导致存储爆满,进而造成了各个客户端不能正常发送消息。针对这些死信队列,一般都没有利用价值的。


        为了避免某队列的死信队列的挤压,而使整个jms不可用,我们选择了通过ActiveMQ的配置,直接丢弃掉死信队列的消息。缺省死信队列(Dead Letter Queue)叫做ActiveMQ.DLQ所有的未送达消息都会被发送到这个队列,以致会非常难于管理。

    所以我们为了防止内存挤压导致mq不可用的情况发生,就需要对死信进行配置。可以通过配置文件(activemq.xml)来调整死信发送策略。


一些配置策略:


1.  不使用缺省的死信队列
   缺省所有队列的死信消息都被发送到同一个缺省死信队列,不便于管理。可以通过individualDeadLetterStrategy或sharedDeadLetterStrategy策略来进行修改。如下:

<broker>  <destinationPolicy>    <policyMap>      <policyEntries>        <!— 设置所有队列,使用 '>' ,否则用队列名称 -->        <policyEntry queue=">">          <deadLetterStrategy>            <!--                    queuePrefix:设置死信队列前缀                    useQueueForQueueMessages: 设置使用队列保存死信,还可以设置useQueueForTopicMessages,使用Topic来保存死信            -->            <individualDeadLetterStrategy   queuePrefix="DLQ." useQueueForQueueMessages="true" />          </deadLetterStrategy>        </policyEntry>      </policyEntries>    </policyMap>  </destinationPolicy>  ...</broker>

2.  非持久消息保存到死信队列

<policyEntry queue=">">          <deadLetterStrategy>            <sharedDeadLetterStrategy processNonPersistent="true" />          </deadLetterStrategy>        </policyEntry> 

3.  过期消息不保存到死信队列

<policyEntry queue=">">          <deadLetterStrategy>            <sharedDeadLetterStrategy processExpired="false" />          </deadLetterStrategy>        </policyEntry>  

4.  持久消息不保存到死信队列

 对于过期的,可以通过processExpired属性来控制,对于redelivered的失败的消息,需要通过插件来实现如下:丢弃所有死信 

<beans>
<broker>      <plugins>        <discardingDLQBrokerPlugin dropAll="true" dropTemporaryTopics="true" dropTemporaryQueues="true" />      </plugins>    </broker>  </beans>