Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1828404
  • 博文数量: 286
  • 博客积分: 3713
  • 博客等级: 少校
  • 技术积分: 2275
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-11 09:47
个人简介

http://blog.chinaunix.net/uid/16979052.html

文章分类

全部博文(286)

文章存档

2018年(1)

2017年(16)

2016年(9)

2015年(17)

2014年(15)

2013年(112)

2012年(116)

分类: Java

2013-12-10 14:09:23

在以下三种情况中,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代码  收藏代码
 
   
     
       
         
         
           
             
                          queuePrefix="DLQ." useQueueForQueueMessages="true" />  
         
 
       
 
     
 
   
 
 
 
  ...  
 




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




将非持久消息(non-persistent messages)放入死信队列 
ActiveMQ缺省不会将未发到的非持久消息放入死信队列。如果一个应用程序并不想将消息message设置为持久的,那么记录下来那些未发送到的消息对它来说往往也是没有价值的。不过如果想实现这个功能,可以在dead-letter strategy死信策略上设置processNonPersistent="true" 
Java代码  收藏代码
 
   
     
       
         
         
           
           
             
         
 
       
 
     
 
   
 
 
 
...  
 
阅读(2946) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~