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 ...
随机推荐
- 关于Mysql触发器的使用
当我在回复表新增数据 我就会执行下列语句 触发器在mysql的使用过DELIMITER $$开头 END; $$ 结尾,注意 触发的语句必须用:结尾 创建触发器DELIMITER $$CREATE T ...
- python xlrd 读取表格 单元格值被覆盖
代码实现顺序: 按行读取 按列读取 满足if条件 单元格值赋值给字典 实现代码: datas = []# 定义一个空列表 for i in range (3,nrows): sheet_data={} ...
- postman发送数组
postman发送数组 第一种 第二种
- Tomcat之Jconsole监控
JConsole的图形用户界面是一个符合Java管理扩展(JMX)规范的监测工具,JConsole使用Java虚拟机(Java VM),提供在Java平台上运行的应用程序的性能和资源消耗的信息.在Ja ...
- 面试官:工作中优化MySQL的手段有哪些?
MySQL 是面试中必问的模块,而 MySQL 中的优化内容又是常见的面试题,所以本文来看"工作中优化MySQL的手段有哪些?". 工作中常见的 MySQL 优化手段分为以下五大类 ...
- 小了 60,500 倍,但更强;AI 的“深度诅咒”
作者:Ignacio de Gregorio 图片来自 Unsplash 的 Bahnijit Barman 几周前,我们看到 Anthropic 尝试训练 Claude 去通关宝可梦.模型是有点进展 ...
- python API 之 fastapi
为什么选择 FastAPI? 高性能:基于 Starlette 和 Uvicorn,支持异步请求处理 开发效率:自动交互文档.类型提示.代码自动补全 现代标准:兼容 OpenAPI 和 JSON Sc ...
- centos简单文件备份
1. 背景 现在有一个正在使用的服务器, 需要对服务器上的数据库数据.实验室文件以及采购平台文件进行备份, 将备份文件存储到另外一个服务器上, 要求留存最近七天的备份文件. 2.详细步骤 2.1 备份 ...
- 深入理解Java虚拟机-JAVA内存模型与线程
Java内存模型(JMM) JMM 的核心概念 主内存与工作内存: 主内存(Main Memory)是所有线程共享的内存区域,存放着所有变量的值 每个线程都有自己的 工作内存(Working Memo ...
- ESP32S3播放音频文件
ESP32S3播放音频文件 硬件基于立创实战派esp32s3 软件代码基于立创实战派教程修改,分析 播放PCM格式音频 原理图分析 音频芯片ES8311 ES8311_I2C_ADD:0x18 音频功 ...