ActiveMQ消息投递方式+死信队列
死信队列
死信队列(Dead Letter Queue,DLQ),用来保存处理失败或者过期的信息。出现以下情况的时候,消息会被重发:
- 在一个事务session中调用了session.rollback()方法。
- 在一个事务session中,session.commit()之前调用了commit.close()。
- 在session中使用CLIENT_ACKNOWLEDGE签收模式,并且调用了session.recover()方法。
- 在非事务session中使用INDIVIDUAL_ACKNOWLEDGE签收模式,并且调用了session.recover()方法。
在session中使用AUTO_ACKNOWLEDGE签收模式,在异步(messageListener)消费消息情况下,如果onMessage方法异常且没有被catch,此消息会被redelivery。
当一个消息被重发次数超过设置的最大重发次数(缺省为6)时,会给broker发送一个“poison ack”,此消息被认为是a poison pill,这时broker会将这个消息发送到死信队列,以便后续处理。注意两点:
1. 缺省持久消息过期,会被送到DLQ,非持久消息不会送到DLQ。
2. 默认的死信队列是ActiveMQ.DLQ,如果没有特别指定,死信都会被发送到这个队列中。
可以通过配置文件activemq.xml来调整死信发送策略。在浏览器地址栏输入 http://localhost:8161/admin ,打开ActiveMQ的管理界面,可以看到私信队列数量:

从控制面板可知,死信队列默认名为ActiveMQ.DLQ,其数量为20条。顺便介绍一下控制面板各个表头的含义:
- Number Of Consumers:消费者数量;
- Number Of Pending Messages:等待消费的消息数量,这个是当前未出队列的数量;
- Messages Enqueued:进入队列的消息量,它只增不减,重启后会清零;
- Messages Dequeued:被消费的消息量,重启后会清零。
如果设置了消息的持久化,那么重启前没有被消费的消息会在Number Of Pending Messages中显示。
配置死信队列
在activemq.xml中,为队列【east7-queue】配置独立的死信队列,下面是queue和topic两种形式,我选择点对点模式queue,新增配置信息字体为红色:
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">">
<deadLetterStrategy>
<individualDeadLetterStrategy queuePrefix="DLQ." useQueueForQueueMessages="true"/>
</deadLetterStrategy>
</policyEntry>
<policyEntry topic=">" >
<!-- The constantPendingMessageLimitStrategy is used to prevent
slow topic consumers to block producers and affect other consumers
by limiting the number of messages that are retained
For more information, see: http://activemq.apache.org/slow-consumer-handling.html -->
<pendingMessageLimitStrategy>
<constantPendingMessageLimitStrategy limit="1000"/>
</pendingMessageLimitStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
- queuePrefix:设置死信队列前缀。
- useQueueForQueueMessages: 设置使用队列保存死信,还可以设置useQueueForTopicMessages,使用Topic来保存死信。
使用<policyEntry queue="east7-queue">指定待创建死信队列的队列为DLQ.east7-queue,其它的队列的死信队列使用队列名。如下图所示,myDest.queue私信队列中消息数量为3。如果<policyEntry queue=">">,则是为所有点对点模式队列创建DLQ.+队列名的死信队列。

还有其他策略,这个要根据实际情况来对应处理。比如:非持久消息保存到死信队列
1 <policyEntry queue=">">
2 <deadLetterStrategy>
3 <sharedDeadLetterStrategy processNonPersistent="true" />
4 </deadLetterStrategy>
5 </policyEntry>
过期消息不保存到死信队列:
1 <policyEntry queue=">">
2 <deadLetterStrategy>
3 <sharedDeadLetterStrategy processExpired="false" />
4 </deadLetterStrategy>
5 </policyEntry>
关于本文内容,大家有什么看法?欢迎留言讨论,也希望大家多多点赞关注。祝各位生活愉快!工作顺利!
ActiveMQ消息投递方式+死信队列的更多相关文章
- RocketMQ之八:重试队列,死信队列,消息轨迹
问题思考 死信队列的应用场景? 死信队列中的数据是如何产生的? 如何查看死信队列中的数据? 死信队列的读写权限? 死信队列如何消费? 重试队列和死信队列的配置 消息轨迹 1.应用场景 一般应用在当正常 ...
- RabbitMQ延迟消息:死信队列 | 延迟插件 | 二合一用法+踩坑手记+最佳使用心得
前言 前段时间写过一篇: # RabbitMQ:消息丢失 | 消息重复 | 消息积压的原因+解决方案+网上学不到的使用心得 很多人加了我好友,说很喜欢这篇文章,也问了我一些问题. 因为最近工作比较忙, ...
- RabbitMQ死信队列另类用法之复合死信
前言 在业务开发过程中,我们常常需要做一些定时任务,这些任务一般用来做监控或者清理任务,比如在订单的业务场景中,用户在创建订单后一段时间内,没有完成支付,系统将自动取消该订单,并将库存返回到商品中,又 ...
- ActiveMQ消息的消费原理
消费端消费消息: 在 初识ActiveMQ 中我提到过,两种方法可以接收消息,一种是使用同步阻塞的ActiveMQMessageConsumer#receive方法.另一种是使用消息监听器Messag ...
- 【MQ中间件】RabbitMQ -- RabbitMQ死信队列及内存监控(4)
1.RabbitMQ TTL及死信队列 1.1.TTL概述 过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取:过了之后消息将自动被删除.RabbitMQ可以对消息和队列设 ...
- RabbitMQ实战-死信队列
RabbitMQ死信队列 场景说明 代码实现 简单的Util 生产者 消费者 场景说明 场景: 当队列的消息未正常被消费时,如何解决? 消息被拒绝并且不再重新投递 消息超过有效期 队列超载 方案: 未 ...
- springboot rabbitmq 死信队列应用场景和完整demo
何为死信队列? 死信队列实际上就是,当我们的业务队列处理失败(比如抛异常并且达到了retry的上限),就会将消息重新投递到另一个Exchange(Dead Letter Exchanges),该Exc ...
- RabbitMQ TTL、死信队列
TTL概念 TTL是Time To Live的缩写,也就是生存时间. RabbitMQ支持消息的过期时间,在消息发送时可以进行指定. RabbitMQ支持队列的过期时间,从消息入队列开始计算,只要超过 ...
- rabbitmq系列(四)死信队列
一.什么是死信队列 当消息在一个队列中变成一个死信之后,它将被重新publish到另一个交换机上,这个交换机我们就叫做死信交换机,私信交换机将死信投递到一个队列上就是死信队列.具体原理如下图: 消息变 ...
- Kafka 实现延迟队列、死信队列、重试队列
更多内容,访问 IT-BLOG Kafka中实现延迟队列 在发送延时消息的时候并不是先投递到要发送的真实主题(real_topic)中,而是先投递到一些 Kafka 内部的主题(delay_topic ...
随机推荐
- Navicat 如何将表恢复默认状态下
场景: 测试一套流程后,造测试数据非常麻烦的情况下,如何通过更改数据库为默认情况即初始表数据 案例: 比如表原有结构如下图(一) 修改后数据如下图(二): 需求:将图二数据恢复到图一内容下 操作思想: ...
- 值得推荐的IT公司名单(国企篇)
大家好,今天我们来盘点一下值得推荐的国企,这些企业在行业内具有举足轻重的地位,不仅主营业务突出,福利待遇优厚,尤其是研发岗位的薪资区间,更是让人眼前一亮. 十大顶尖央企国企,待遇优厚如天花板级别!(排 ...
- 【vscode】vscode配置汇编环境
[vscode]vscode配置汇编环境 前言 因为近来个人的课程涉及到汇编语言,加上个人目前是个vscode的重度使用者,所以,要捣鼓一下汇编的配置. 自然,有很多博客写过如何配置,但是每个人在 ...
- mysql存储过程之循环遍历查询结果集
mysql存储过程之循环遍历查询结果集 -- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除 DROP PROCEDURE IF EXISTS init_reportUrl; -- 创建存储 ...
- php去除金额后面多余的0(零)
第一种: 使用floatval() 第二种: rtrim(rtrim($str, '0'), '.'); 比如$str=2.360000; 最后会输出2.36 第三种使用正则: /** * 去除多余的 ...
- Docker使用手册--给你通用常用命令
卸载JDK rpm -qa | grep -i java rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps 安装JDK tar -zxvf jdk- ...
- linux命令:lsof命令
lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控制协议 ...
- leetcode每日一题:酿造药水需要的最少总时间
引言 今天的每日一题原题是2255. 统计是给定字符串前缀的字符串数目,直接模拟,逐个匹配words中的字符串是否是s的前缀即可.更换成前几天遇到的更有意思的一题来写这个每日一题. 题目 给你两个 ...
- nodejs队列
nodejs队列 创建具有指定并发性的队列对象.添加到队列的任务以并行方式处理(直到并发性限制).如果所有的worker都在进行中,任务就会排队,直到有一个worker可用.worker完成任务后,将 ...
- VJ结营测试
A 这题其实自己画一下图可以发现当奇数行为每行都为W,偶数行为W与R交替出现,就可以得到满足题意的图形了. 点击查看代码 #include<bits/stdc++.h> using nam ...