ActiveMQ的消息重发与死信管理(DLQ)
2015-10-30 16:47
501 查看
DLQ-死信队列(Dead Letter Queue)用来保存处理失败或者过期的消息。
出现以下情况时,消息会被redelivered(重发):
A transacted session is used and rollback() is called(使用一个事务session,并且调用了rollback()方法).
A transacted session is closed before commit is called(一个事务session,关闭之前调用了commit).
A session is using CLIENT_ACKNOWLEDGE and Session.recover() is called(在session中使用CLIENT_ACKNOWLEDGE签收模式,并且调用了Session.recover()方法).
当一个消息被redelivered超过maximumRedeliveries(缺省为6次,具体设置请参考后面的链接)次数时,会给broker发送一个"Poison ack",这个消息被认为是a poison pill(毒丸),这时broker会将这个消息发送到DLQ,以便后续处理。
缺省的死信队列是ActiveMQ.DLQ,如果没有特别指定,死信都会被发送到这个队列。
缺省持久消息过期,会被送到DLQ,非持久消息不会送到DLQ
可以通过配置文件(activemq.xml)来调整死信发送策略。
1. 不使用缺省的死信队列
2. 非持久消息保存到死信队列
3. 过期消息不保存到死信队列
4. 持久消息不保存到死信队列
5. 死信队列消息的属性
死信队列中的消息,会增加几个属性,比如原过期时间(originalExpiration),原originalDeliveryMode等
参考:
DLQ处理说明:http://activemq.apache.org/message-redelivery-and-dlq-handling.html
individualDeadLetterStrategy属性说明:http://fusesource.com/docs/broker/5.3/configref/http.activemq.apache.or/element/individualdeadletterstr.html
sharedDeadLetterStrategy属性说明:http://fusesource.com/docs/broker/5.3/configref/http.activemq.apache.or/element/shareddeadletterstrateg.html
redelivery属性说明:http://activemq.apache.org/redelivery-policy.html
出现以下情况时,消息会被redelivered(重发):
A transacted session is used and rollback() is called(使用一个事务session,并且调用了rollback()方法).
A transacted session is closed before commit is called(一个事务session,关闭之前调用了commit).
A session is using CLIENT_ACKNOWLEDGE and Session.recover() is called(在session中使用CLIENT_ACKNOWLEDGE签收模式,并且调用了Session.recover()方法).
当一个消息被redelivered超过maximumRedeliveries(缺省为6次,具体设置请参考后面的链接)次数时,会给broker发送一个"Poison ack",这个消息被认为是a poison pill(毒丸),这时broker会将这个消息发送到DLQ,以便后续处理。
缺省的死信队列是ActiveMQ.DLQ,如果没有特别指定,死信都会被发送到这个队列。
缺省持久消息过期,会被送到DLQ,非持久消息不会送到DLQ
可以通过配置文件(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>
丢弃指定目的死信
<beans> <broker ...> <plugins> <discardingDLQBrokerPlugin dropOnly="MY.EXAMPLE.TOPIC.29 MY.EXAMPLE.QUEUE.87" reportInterval="1000" /> </plugins> </broker> </beans>
注意,目的名称使用空格分隔
The reportInterval property is used to denote how frequently do we output how many messages we have dropped - use 0 to disable.
用正则表达式过滤丢弃消息:
<beans> <broker ...> <plugins> <discardingDLQBrokerPlugin dropOnly="MY.EXAMPLE.TOPIC.[0-9]{3} MY.EXAMPLE.QUEUE.[0-9]{3}" reportInterval="3000"/> </plugins> </broker> </beans>
5. 死信队列消息的属性
死信队列中的消息,会增加几个属性,比如原过期时间(originalExpiration),原originalDeliveryMode等
参考:
DLQ处理说明:http://activemq.apache.org/message-redelivery-and-dlq-handling.html
individualDeadLetterStrategy属性说明:http://fusesource.com/docs/broker/5.3/configref/http.activemq.apache.or/element/individualdeadletterstr.html
sharedDeadLetterStrategy属性说明:http://fusesource.com/docs/broker/5.3/configref/http.activemq.apache.or/element/shareddeadletterstrateg.html
redelivery属性说明:http://activemq.apache.org/redelivery-policy.html
相关文章推荐
- openswitch db files
- 基于CSS3的WEBAPP横向滑动模式演化
- Android ListView异步加载图片乱序问题,原因分析及解决方案
- 访问javascript对象的属性和方法
- javascript浮动广告的实现
- mysql proxy 主从复制 读写分离
- 监督学习和无监督学习的详细介绍
- Linux 技巧:让进程在后台可靠运行的几种方法
- uva10250 The Other Two Trees
- Bug优先级与严重程度的划分
- 基于vlfeat的HOG特征提取c++代码实现
- KVC - 键值编码
- Spring MVC篇一、搭建Spring MVC框架
- 排序算法---直接插入
- hasSystemFeature()判断系统是否有特定的模块功能
- Android debug-you cannot combine custom titles with other title features
- linux 让你的进程后台运行
- Hadoop中HDFS文件系统NameNode的Federation设计文档(HDFS-1052:Hdfs scalability with multiple namenodes)
- IDEA 项目相关基础设置
- Oracle 12C -- Plug in a Non-CDB as a PDB