死信队列

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

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

在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. 前端之css的基本使用(一),行内、内部、外部样式,语法格式、注释、选择符、属性等

    一.行内.内部.外部样式 1.行内样式 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  2. Python入门小建议

    "java从心"正式更名"KEN DO EVERTHING".Ken(Can) Do Everything,无所不能 Believe youseft then ...

  3. PairProgramming 个人第三次作业

    Github地址:主仓库 https://github.com/Yanyixiao/PairProgramming.git Partner博客园地址: https://www.cnblogs.com/ ...

  4. Centos7搭建FastFDS----分布式文件服务系统服务端

    一.FastDFS介绍 FastDFS开源地址:https://github.com/happyfish100 参考:分布式文件系统FastDFS设计原理 参考:FastDFS分布式文件系统 1.1简 ...

  5. mysql--->MySQL错误日志

    MySQL错误日志 简介 MySQL错误日志是记录MySQL 运行过程中较为严重的警告和错误信息,以及MySQL每次启动和关闭的详细信息.错误日志的命名通常为hostname.err.其中,hostn ...

  6. HBase学习总结

    一.HBase介绍 1.基本概念 HBase是一种Hadoop数据库,经常被描述为一种稀疏的,分布式的,持久化的,多维有序映射,它基于行键.列键和时间戳建立索引,是一个可以随机访问的存储和检索数据的平 ...

  7. 从App.config中读取数据库连接字符串

    1.首先在App.config文件中添加如下代码注意<connectionStrings>插入位置. <connectionStrings> <add name=&quo ...

  8. requestAnimationFrame 与 seeTimeout 的区别

    requestAnimationFrame 随着浏览器的刷新而执行. let a =  () =>{          doSomething() ;         window.reques ...

  9. DISCUZ 如何为主题帖列表页添加头像,显示发帖者头像

    只显示名字的代码 ```php<em style=" font-size:14px;"> <!--{if $thread['authorid'] &&am ...

  10. 10、VLAN

    VLAN综述:1.分段2.灵活性3.安全性 一个VLAN=一个广播域=逻辑网段(子网) VLAN运作:1.每个逻辑的VLAN就象一个独立的物理桥2.交换机上的每一个端口都可以分配给不同的VLAN3.默 ...