您的位置:首页 > 其它

ActiveMQ的消息重发策略和DLQ处理

2016-03-10 16:05 381 查看
在以下三种情况中,ActiveMQ消息会被重发给客户端/消费者: 
1.使用一个事务session,并且调用了rollback()方法; 
2.一个事务session,关闭之前调用了commit; 
3.在session中使用CLIENT_ACKNOWLEDGE签收模式,并且调用了Session.recover()方法。 

Broker根据自己的规则,通过BrokerInfo命令包和客户端建立连接,向客户端传送缺省发送策略。但是客户端可以使用ActiveMQConnection.getRedeliveryPolicy()方法覆盖override这个策略设置。 

Java代码 

 


RedeliveryPolicy policy = connection.getRedeliveryPolicy();  

policy.setInitialRedeliveryDelay(500);  

policy.setBackOffMultiplier(2);  

policy.setUseExponentialBackOff(true);  

policy.setMaximumRedeliveries(2);  

一旦消息重发尝试超过重发策略中配置的maximumRedeliveries(缺省为6次)时,会给broker发送一个"Poison ack",通知它,这个消息被认为是一个毒丸(a poison pill),接着broker会将这个消息发送到DLQ(Dead Letter Queue),以便后续分析处理。 

缺省死信队列(Dead Letter Queue)叫做ActiveMQ.DLQ;所有的未送达消息都会被发送到这个队列,以致会非常难于管理。你可以设置activemq.xml文件中的destination policy map的"individualDeadLetterStrategy"属性来修改. 

Java代码 

 


<broker...>  

  <destinationPolicy>  

    <policyMap>  

      <policyEntries>  

        <!-- Set the following policy on all queues using the '>' wildcard -->  

        <policyEntry queue=">">  

          <deadLetterStrategy>  

            <!--  

              Use the prefix 'DLQ.' for the destination name, and make  

              the DLQ a queue rather than a topic  

            -->  

            <individualDeadLetterStrategy  

              queuePrefix="DLQ." useQueueForQueueMessages="true" />  

          </deadLetterStrategy>  

        </policyEntry>  

      </policyEntries>  

    </policyMap>  

  </destinationPolicy>  

  ...  

</broker>  

自动丢弃过期消息(Expired Messages) 
一些应用可能只是简单的丢弃过期消息,而不想将它们放到DLQ中,完全跳过了DLQ。在dead letter strategy死信策略上配置processExpired属性为false,可以实现这个功能。 

Java代码 

 


<broker...>  

  <destinationPolicy>  

   <policyMap>  

     <policyEntries>  

       <!-- Set the following policy on all queues using the '>' wildcard -->  

       <policyEntry queue=">">  

         <!--  

           Tell the dead letter strategy not to process expired messages  

           so that they will just be discarded instead of being sent to  

           the DLQ  

         -->  

         <deadLetterStrategy>  

           <sharedDeadLetterStrategy processExpired="false" />  

         </deadLetterStrategy>  

       </policyEntry>  

     </policyEntries>  

   </policyMap>  

  </destinationPolicy>  

...  

</broker>  

将非持久消息(non-persistent messages)放入死信队列 
ActiveMQ缺省不会将未发到的非持久消息放入死信队列。如果一个应用程序并不想将消息message设置为持久的,那么记录下来那些未发送到的消息对它来说往往也是没有价值的。不过如果想实现这个功能,可以在dead-letter strategy死信策略上设置processNonPersistent="true" 

Java代码 

 


<broker...>  

  <destinationPolicy>  

   <policyMap>  

     <policyEntries>  

       <!-- Set the following policy on all queues using the '>' wildcard -->  

       <policyEntry queue=">">  

         <!--  

           Tell the dead letter strategy to also place non-persisted messages  

           onto the dead-letter queue if they can't be delivered.  

         -->  

         <deadLetterStrategy>  

           <sharedDeadLetterStrategy processNonPersistent="true" />  

         </deadLetterStrategy>  

       </policyEntry>  

     </policyEntries>  

   </policyMap>  

  </destinationPolicy>  

...  

</broker>  

/article/3922735.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: