死信队列

消息传输过程中难免会产生一些无法及时处理的消息,这些暂时无法处理的消息有时候也是需要被保留下来的,于是这些无法被及时处理的消息就变成了死信。

既然需要保留这些死信,那么就需要一个容器来存储它们以便后续需要时将它们取出来进行处理,于是就有了死信队列。

在RabbitMQ中当一个消息变成死信后会被重新发送到一个死信交换机(DLXs)中,当下列情况发生时队列中的消息会变成死信:

1:当消费端使用手动ack时,requeue属性为false时,消息被拒绝(basic.reject, basic.nack),换句话说就是消息被拒绝接收又不能回到原始队列中去

2:消息过期

3:队列超出最大限制导致消息无法发送到队列

死信交换机

死信交换机只是一个普通的交换机,它的声明使用与普通交换机没有什么区别

对于任意的队列,一个死信交换机可以被定义通过客户端使用队列参数,或者在服务端使用策略(polices),强烈建议使用polices的方式配置死信交换机,因为它不需要修改客户端代码,也不需要重启服务。

下面介绍使用RabbitMQ的管理界面进行死信队列的配置

  1. 进入policies配置页面

  2. 配置死信策略

  3. 在交换机界面配置死信交换机

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

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

  6. 配置完成

测试

生产者代码

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);
}
}
}
  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 -> { });
}
}
  1. 分别运行消费者与生产者,在RabbitMQ的管理界面观察队列的状态

RabbitMQ配置死信队列的更多相关文章

  1. RabbitMQ之死信队列

    1:何为死信队列 死信队列也是一个正常的队列,可以被消费. 但是,死信队列的消息来源于其他队列的转发. 2:如何触发死信队列 1:消息超时 2:队列长度达到极限 3:消息被拒绝消费,并不再重进队列,且 ...

  2. RabbitMQ实战-死信队列

    RabbitMQ死信队列 场景说明 代码实现 简单的Util 生产者 消费者 场景说明 场景: 当队列的消息未正常被消费时,如何解决? 消息被拒绝并且不再重新投递 消息超过有效期 队列超载 方案: 未 ...

  3. RabbitMQ死信队列另类用法之复合死信

    前言 在业务开发过程中,我们常常需要做一些定时任务,这些任务一般用来做监控或者清理任务,比如在订单的业务场景中,用户在创建订单后一段时间内,没有完成支付,系统将自动取消该订单,并将库存返回到商品中,又 ...

  4. 【RabbitMQ】一文带你搞定RabbitMQ死信队列

    本文口味:爆炒鱿鱼   预计阅读:15分钟 一.说明 RabbitMQ是流行的开源消息队列系统,使用erlang语言开发,由于其社区活跃度高,维护更新较快,性能稳定,深得很多企业的欢心(当然,也包括我 ...

  5. RabbitMQ 死信队列 延时

    package com.hs.services.config; import java.util.HashMap; import java.util.Map; import org.springfra ...

  6. 关于 RabbitMQ 的 Dead-Letters-Queue “死信队列”

      来自一个队列的消息可以被当做‘死信’,即被重新发布到另外一个“exchange”去,这样的情况有: 消息被拒绝 (basic.reject or basic.nack) 且带 requeue=fa ...

  7. RabbitMQ死信队列

    关于RabbitMQ死信队列 死信队列 听上去像 消息“死”了     其实也有点这个意思,死信队列  是 当消息在一个队列 因为下列原因: 消息被拒绝(basic.reject/ basic.nac ...

  8. RabbitMQ 消费端限流、TTL、死信队列

    目录 消费端限流 1. 为什么要对消费端限流 2.限流的 api 讲解 3.如何对消费端进行限流 TTL 1.消息的 TTL 2.队列的 TTL 死信队列 实现死信队列步骤 总结 消费端限流 1. 为 ...

  9. 【RabbitMQ 实战指南】一 死信队列

    1.死信队列 DLX,全称为 Dead-Letter-Exchange,可以称之为死信交换器.当消息在一个队列中变成死信(dead message)之后,它能被发送到另一个交换器中,这个交换器就是DL ...

随机推荐

  1. (树形DP入门题)Anniversary party(没有上司的舞会) HDU - 1520

    题意: 有个公司要举行一场晚会.为了让到会的每个人不受他的直接上司约束而能玩得开心,公司领导决定:如果邀请了某个人,那么一定不会再邀请他的直接的上司,但该人的上司的上司,上司的上司的上司等都可以邀请. ...

  2. Quartz cron 表达式(linux 定时器,java 定时任务,spring task定时任务)

    原文地址:https://blog.csdn.net/feng27156/article/details/39293403 Quartz cron 表达式的格式十分类似于 UNIX cron 格式,但 ...

  3. 从零开始ming的多人联机游戏(3)为socket通讯添加mysql数据库

    macOS下visual studio C#加载mySql 本文在上一节的基础上,添加了mysql数据库的功能.client发送信息给服务器后,服务器将收到的消息保存在数据库中. 如果client发送 ...

  4. NOI4.6 最小新整数——切山游戏

    描述 给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0.n的位数为m. 现在从m位中删除k位(0<k < m),求生成的新整数最小为多少? ...

  5. Unity SurfaceShader详解

    声明:文章主要是总结手游开发的经验,只涉及到了前向渲染.未涉及延迟渲染. Unity的Surface Shader本质上就是VS/PS.只不过Unity经过精心设计,将shader划分为了几个关键部分 ...

  6. 基于BIO的实时Socket读写操作

    文章目录 前言 Socket类2.1 Socket的通信过程2.2 控制Socket连接2.3 设置Socket的选项 ServerSocket类3.1 构造ServerSocket3.2 Serve ...

  7. IO博客专栏

    1. IO概览 2. 字符流与字节流的区别

  8. Cobaltstrike指令/beacon命令大全

    browserpivot 注入受害者浏览器进程bypassuac 绕过UACcancel 取消正在进行的下载cd 切换目录checkin 强制让被控端回连一次clear 清除beacon内部的任务队列 ...

  9. CAD制图系列一之绘图、标注、修改、视图

    笔记内容: 缩放.平移.键盘操作 绘图:直线.矩形 修改:删除.修剪.延时 标注:线型.对齐.半径.折弯.直径.角度 知识点 鼠标中键上下滚动 平移:先全部选中,然后点击中间的空格,随便移动 重点:空 ...

  10. QT透明显示文字

    实现效果: 代码: #ifndef IMAGINIST_H #define IMAGINIST_H #include <QtWidgets/QWidget> #include <Qt ...