RabbitMQ配置死信队列
死信队列
消息传输过程中难免会产生一些无法及时处理的消息,这些暂时无法处理的消息有时候也是需要被保留下来的,于是这些无法被及时处理的消息就变成了死信。
既然需要保留这些死信,那么就需要一个容器来存储它们以便后续需要时将它们取出来进行处理,于是就有了死信队列。
在RabbitMQ中当一个消息变成死信后会被重新发送到一个死信交换机(DLXs)中,当下列情况发生时队列中的消息会变成死信:
1:当消费端使用手动ack时,requeue属性为false时,消息被拒绝(basic.reject, basic.nack),换句话说就是消息被拒绝接收又不能回到原始队列中去
2:消息过期
3:队列超出最大限制导致消息无法发送到队列
死信交换机
死信交换机只是一个普通的交换机,它的声明使用与普通交换机没有什么区别
对于任意的队列,一个死信交换机可以被定义通过客户端使用队列参数,或者在服务端使用策略(polices),强烈建议使用polices的方式配置死信交换机,因为它不需要修改客户端代码,也不需要重启服务。
下面介绍使用RabbitMQ的管理界面进行死信队列的配置
- 进入policies配置页面

- 配置死信策略

- 在交换机界面配置死信交换机

- 在队列页面新建一个用于接收死信的死信队列

- 配置死信交换机的路由规则

- 配置完成
测试
生产者代码
public class DeadSender {
private static final String EXCHANGE_NAME = "amqp.car";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.135.88");
factory.setUsername("admin");
factory.setPassword("admin");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
//声明一个名为amqp.car的交换机,将消息发送至该交换机
channel.exchangeDeclare(EXCHANGE_NAME, "direct");
//每隔一秒发送一条消息,设置routind Key 为 car
while (true) {
channel.basicPublish(EXCHANGE_NAME, "car", null, "我是死信消息".getBytes("UTF-8"));
TimeUnit.SECONDS.sleep(1);
}
}
}
- 消费者代码,拒绝所有消息用于测试
public class DeadReceive {
private static final String EXCHANGE_NAME = "amqp.car";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.135.88");
factory.setUsername("admin");
factory.setPassword("admin");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "direct");
//声明一个队列用于接收消息
String queueName = "car.queue";
channel.queueDeclare(queueName, true, false, false, null);
//绑定队列,设置routing key为car
channel.queueBind(queueName, EXCHANGE_NAME, "car");
//消息接收后的回调方法
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" 收到信息:" +
delivery.getEnvelope().getRoutingKey() + "':'" + message + "'");
//收到消息后直接拒绝,并设置requeue属性为false,这样被拒绝的消息就不会重新回到原始队列中而是转发到死信交换机
channel.basicNack(delivery.getEnvelope().getDeliveryTag(), false, false);
};
//接收消息,关闭自动ack
channel.basicConsume(queueName, false, deliverCallback, consumerTag -> { });
}
}
- 分别运行消费者与生产者,在RabbitMQ的管理界面观察队列的状态

RabbitMQ配置死信队列的更多相关文章
- RabbitMQ之死信队列
1:何为死信队列 死信队列也是一个正常的队列,可以被消费. 但是,死信队列的消息来源于其他队列的转发. 2:如何触发死信队列 1:消息超时 2:队列长度达到极限 3:消息被拒绝消费,并不再重进队列,且 ...
- RabbitMQ实战-死信队列
RabbitMQ死信队列 场景说明 代码实现 简单的Util 生产者 消费者 场景说明 场景: 当队列的消息未正常被消费时,如何解决? 消息被拒绝并且不再重新投递 消息超过有效期 队列超载 方案: 未 ...
- RabbitMQ死信队列另类用法之复合死信
前言 在业务开发过程中,我们常常需要做一些定时任务,这些任务一般用来做监控或者清理任务,比如在订单的业务场景中,用户在创建订单后一段时间内,没有完成支付,系统将自动取消该订单,并将库存返回到商品中,又 ...
- 【RabbitMQ】一文带你搞定RabbitMQ死信队列
本文口味:爆炒鱿鱼 预计阅读:15分钟 一.说明 RabbitMQ是流行的开源消息队列系统,使用erlang语言开发,由于其社区活跃度高,维护更新较快,性能稳定,深得很多企业的欢心(当然,也包括我 ...
- RabbitMQ 死信队列 延时
package com.hs.services.config; import java.util.HashMap; import java.util.Map; import org.springfra ...
- 关于 RabbitMQ 的 Dead-Letters-Queue “死信队列”
来自一个队列的消息可以被当做‘死信’,即被重新发布到另外一个“exchange”去,这样的情况有: 消息被拒绝 (basic.reject or basic.nack) 且带 requeue=fa ...
- RabbitMQ死信队列
关于RabbitMQ死信队列 死信队列 听上去像 消息“死”了 其实也有点这个意思,死信队列 是 当消息在一个队列 因为下列原因: 消息被拒绝(basic.reject/ basic.nac ...
- RabbitMQ 消费端限流、TTL、死信队列
目录 消费端限流 1. 为什么要对消费端限流 2.限流的 api 讲解 3.如何对消费端进行限流 TTL 1.消息的 TTL 2.队列的 TTL 死信队列 实现死信队列步骤 总结 消费端限流 1. 为 ...
- 【RabbitMQ 实战指南】一 死信队列
1.死信队列 DLX,全称为 Dead-Letter-Exchange,可以称之为死信交换器.当消息在一个队列中变成死信(dead message)之后,它能被发送到另一个交换器中,这个交换器就是DL ...
随机推荐
- django操作命令
下载安装 pip3 install django==1.11.21 -i https://pypi.tuna.tsinghua.edu.cn/simple 创建项目 1.终端找到存放项目的文件夹,dj ...
- Qt Installer Framework翻译(5-2)
创建在线安装程序 联机安装程序获取二进制安装文件中的内容以及存储库描述(Updates.xml).请创建一个存储库,并将其上传到Web服务器.然后在用于创建安装程序的config.xml文件中指定存储 ...
- Codeforces Round #615 (Div. 3) 题解
A - Collecting Coins 题意: 给你四个数a,b,c,d,n.问你是否能将n拆成三个数A,B,C,使得A+a=B+b=C+c. 思路: 先计算三个数的差值的绝对值abs,如果abs大 ...
- 美食家App开发日记5
今天将ListView控件用更强大的Recyclerview控件取代,最后调试了程序. 感觉Android编程难度实在是远远高于javaweb,初次接触,感觉有很多东西想实现,想得很容易,但是实现起来 ...
- 高精度算法(C/C++)
高精度算法 (C/C++) 做ACM题的时候,经常遇到大数的加减乘除,乘幂,阶乘的计算,这时给定的数据类型往往不够表示最后结果,这时就需要用到高精度算法.高精度算法的本质是把大数拆成若干固定长度的块, ...
- c#数字图像处理(九)图像镜像
private void mirror_Click(object sender, EventArgs e) { if (curBitmap!=null) { mirror mirForm = new ...
- 几种常见的排序方法总结(Python)
几种常见的排序算法总结(Python) 排序算法:是一种能将一串数据依照特定顺序进行排序的一种算法. 稳定性:稳定排序算法会让原本有相等键值的记录维持相对次序.也就是如果一个排序算法是稳定的,当有两个 ...
- Shell常用命令之printf
printf 内容格式化输出 格式 printf [format] [输入内容] format参数 %b:打印相关内容并解释其中反斜杠"\"的特殊字符 %q:以shell引用的格式 ...
- Topics类型配置
配置项 备注 segment.bytes 分段文件大小,最大2GB segment.ms 强制新建段文件间隔阀值时间 segment.jitter.ms 段文件抖动时间 segment.index.b ...
- 小米重新上锁[BL]
解锁一时爽,bug火葬场.废话不多说,直接上教程. 首先安装 线刷工具:http://bigota.d.miui.com/tools/MiFlash2018-5-28-0.zip 解锁工具:http: ...