ActiveMQ笔记67-高级特性之死信队列

ActiveMQ对死信队列的介绍:http://activemq.apache.org/message-redelivery-and-dlq-handling

ActiveMQ中引入了死信队列的概念,一条消息被重复发了多次(默认重发6次redeliveryCounter=6),这条消息将会被ActiveMQ加入死信队列。开发人员可以在死信队列中查看出错的消息,进行人工干预。

通常生产环境中,使用MQ会设计两个队列,一个是业务队列,一个是死信队列。

假如第三方物流系统故障,仓储系统每次消费一条订单消息,尝试通知发货和配送,都会遇到对方接口报错,此时仓储系统就可以把这条消息标记为处理失败。一旦标记为处理失败后,MQ会把这条消息转入提前设置好的死信队列。在物流系统故障期间,所有订单全部处理失败,全部会转入死信队列。仓储系统有一个后台线程,监控第三方系统是否正常,当后台线程发现物流系统恢复正常后,后台线程就从死信队列里拿出失败的订单继续处理,重新执行发货和配送的逻辑。

SharedDealLetterStrategy:共享死信队列策略

所有的DeadLetter保存在一个共享的队列中,这是ActiveMQ broker端的默认策略。默认为ActiveMQ.DLQ,可以通过deadLetterQueue属性来设置。

<dealLetterStrategy>
    <sharedDeadLetterStrategy deadLetterQueue="MyDeadLetterQueue">
</dealLetterStrategy>

IndividualDeadLetterStrategy:独特死信队列策略

对于Queue而言,死信通道前缀默认为“ActiveMQ.DLQ.Queue”。

对于Topic而言,死信通道的前缀默认为“ActiveMQ.DLQ.Topic”。

我们使用默认前缀+队列或者主题的名称来指定死信队列。比如:ActiveMQ.DLQ.Queue.MyQueue和ActiveMQ.DLQ.Topic.MyTopic。

默认情况下,无论是Topic还是Queue,broker默认都会使用Queue来保存DeadLetter,即死信队列通常为Queue,开发者也可以指定为Topic。

<policyEntry queue="order">
    <deadLetterStrategy>
        <individualDeadLetterStrategy queuePrefix="DLQ." useQueueForQueueMessages="true"/>
    </deadLetterStrategy>
</policyEntry>

如果需要直接删除过期的消息,而不需要发送到死信队列,那么设置processExpired参数为false,这个参数的默认值是true的。

<deadLetterStrategy>
    <sharedDeadLetterStrategy processExpired="false"/>
</deadLetterStrategy>

默认情况下,ActiveMQ不会把非持久的死信存放到死信队列,如果希望存放非持久的死信,那么需要修改processNonPersistent参数为true,这个参数默认值是fasle。

<deadLetterStrategy>
    <sharedDeadLetterStrategy processNonPersistent="true"/>
</deadLetterStrategy>
发布了172 篇原创文章 · 获赞 1 · 访问量 7146

猜你喜欢

转载自blog.csdn.net/qq_36059561/article/details/104271640
今日推荐