Spring ActiveMQ 整合(五): 死信队列

来源:互联网 发布:黑马程序员java毕业生 编辑:程序博客网 时间:2024/06/06 18:37

1.死信队列和回退队列的区别:

 这篇文章写得非常到位:http://blog.csdn.net/coderepository/article/details/7023304

2.什么是死信队列:

DLQ-死信队列(Dead Letter Queue)用来保存处理失败或者过期的消息。
出现以下情况时,消息会被redelivered
 A transacted session is used and rollback() is called.
 A transacted session is closed before commit is called.
 A session is using CLIENT_ACKNOWLEDGE and Session.recover() is called.
当一个消息被redelivered超过maximumRedeliveries(缺省为6次,具体设置请参考后面的链接)次数时,会给broker发送一个"Poison ack",这个消息被认为是a poison pill,这时broker会将这个消息发送到DLQ,以便后续处理。
缺省的死信队列是ActiveMQ.DLQ,如果没有特别指定,死信都会被发送到这个队列。
缺省持久消息过期,会被送到DLQ,非持久消息不会送到DLQ
可以通过配置文件(activemq.xml)来调整死信发送策略。
具体的配合可参考:http://blog.csdn.net/fengyong7723131/article/details/52415299

3.怎么样才能将失败的消息放入死信队列呢?


      我当时配置的时候,是折腾了好久,我能在界面上看到,我的testQueOne队列里面有消息,但是消费失败后,只见失败,不见他在ActiveMQ.DLQ死信队列里面出现。
    看了好久。最终解决了。
    解决的过程是:
     ①.先给activeMQ配置事务。可参考上篇文章: Spring ActiveMQ 整合(四): JMS 事务管理
     ②.再消费者接受消息失败后,对事物进行回滚,当文件配置的重发机制等等,执行完后,由应用发送rollback触发。
         即:session.rollback();

      这样就进入了死信队列,不进行这样的操作,他是不会出现在死信队列里面的。






   

0 0
原创粉丝点击