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
分享到:
相关推荐
在 ActiveMQ 中,死信队列默认是 ACTIVEMQ.DLQ 队列。可以通过插件来设置死信队列的过期时间和清除策略。 有多种策略可以选择: 1. 直接抛弃死信队列:可以使用 DiscardingDLQBrokerPlugin 插件来抛弃死信队列。...
### ActiveMQ 消息过期时间设置与自动清除解决方案 #### 概述 在消息队列的场景下,为了防止消息长时间滞留在队列中占用资源或者为了满足业务上对消息时效性的需求,通常需要对消息设定过期时间。本文档详细介绍了...
6. **高级特性**:探讨ActiveMQ的事务管理、消息优先级、DLQ(死信队列)和消息重试等高级特性,以及如何利用这些特性优化系统性能和稳定性。 7. **安全性与网络配置**:介绍如何设置用户权限,保护ActiveMQ服务器...
### ActiveMQ消息中间件知识点详解 #### 一、ActiveMQ简介 **ActiveMQ**是一款流行的开源消息中间件,它遵循JMS(Java消息...通过上述知识点的学习与应用,可以有效提升基于ActiveMQ构建的消息系统的稳定性和可靠性。
**7.9 消息重发与死信管理:** - **定义:** 处理未能成功传递给消费者的死信。 - **策略:** 可以配置死信队列和重试策略。 #### 八、ActiveMQ 集群方式 **8.1 AMQ 集群特点:** - **高可用性和负载均衡:** - **...
4. **高级特性**:包括事务、持久化、优先级、时间戳、消息组、死信队列、DLQ 等。 5. **集群与高可用**:描述如何通过集群配置实现 ActiveMQ 的高可用性。 6. **监控与管理**:介绍使用 Web Console 或 JMX 进行...
除了基本的JMS操作,你还将接触到高级功能,比如消息的事务处理、消息选择器(用于过滤接收到的消息)、消息组(让消息在一组消费者之间分发)以及DLQ(死信队列)管理,这些都是在实际应用中非常重要的功能。...
此外,ActiveMQ提供了多种策略来保证消息的可靠传递,如预取策略、死信队列和DLQ(Dead Letter Queue)等。 总结来说,"spring+jms+activemq"的组合为开发者提供了一种高效、可扩展的异步消息处理方案。Spring简化...
为了深入学习ActiveMQ,你可以参考其官方文档、教程和社区讨论,了解更高级的主题,如事务、消息确认、DLQ(死信队列)和性能调优。 总之,"ActiveMQ使用Demo"是一个很好的起点,通过它你可以了解如何在实际项目中...
- **DLQ(Dead Letter Queue)**: 未正确路由或无法消费的消息会被送到死信队列。 - **Message Priority**: 可以设置消息的优先级,高优先级的消息会被优先处理。 - **Message TTL(Time To Live)**: 消息的生命...
在实际应用中,我们需要考虑消息的幂等性、消息确认机制(如publisher confirms和consumer acknowledgments)、死信队列(DLQ)等高级特性,以确保消息的正确传递和处理。 总的来说,消息队列在Java开发中扮演着至...