ActiveMQ的消息重发与死信管理(DLQ)

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)来调整死信发送策略。

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>

Notice that the destination names use regular expressions. These match the number 000..999 at the end of each destination name.



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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值