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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012904383/article/details/78322080

需求场景:


       由于测试环境应用复杂的原因,造成了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>  




展开阅读全文

没有更多推荐了,返回首页