代码编织梦想

1. 死信队列概念

死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer 将消息投递到 broker 或者直接到queue 里了,consumer 从 queue 取出消息进行消费,但某些时候由于特定的原因导致 queue 中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信自然就有了死信队列

死信来源:

  1. 消息 TTL 过期
  2. 队列达到最大长度(队列满了,无法再添加数据到 mq 中)
  3. 消息被拒绝(basic.reject 或 basic.nack)并且 requeue=false,不回放到消息队列中)

在这里插入图片描述


2. 消息 TTL 过期

生产者代码:

package cn.edu.xd.five;

import cn.edu.xd.util.RabbitMQUtils;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Producer {
    private static final String NORMAL_EXCHANGE="normal_exchange";

    public static void main(String[] args) throws IOException, TimeoutException {
        Channel channel= RabbitMQUtils.getChannerl();
        channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);
        //设置消息的TTL时间
        AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().expiration("10000").build();
        for(int i=1;i<=10;i++){
            String msg="info"+i;
            channel.basicPublish(NORMAL_EXCHANGE,"zhangsan",properties,msg.getBytes());
            System.out.println("生产者发送消息:"+msg);
        }
    }
}

消费者1代码。消费者1代码中将正常交换机和死信交换机建立了联系,当正常队列中的消息无法被消费超时时,消息就会被移动到死信队列中

package cn.edu.xd.five;

import cn.edu.xd.util.RabbitMQUtils;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;

public class Consumer01 {
    private static final String NORMAL_EXCHANGE="normal_exchange";
    private static final String DEAD_EXCHANGE="dead_exchange";

    public static void main(String[] args) throws IOException, TimeoutException {
        Channel channel= RabbitMQUtils.getChannerl();
        //声明死信交换机和普通交换机 类型为 direct
        channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);
        channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);

        //声明死信队列
        String deadQueue="dead_queue";
        channel.queueDeclare(deadQueue,false,false,false,null);
        channel.queueBind(deadQueue,DEAD_EXCHANGE,"lisi");

        //声明普通队列
        Map<String, Object> params = new HashMap<>();
        //正常队列设置死信交换机 参数 key 是固定值
        params.put("x-dead-letter-exchange", DEAD_EXCHANGE);
        //正常队列设置死信 routing-key 参数 key 是固定值
        params.put("x-dead-letter-routing-key", "lisi");
        String normalQueue = "normal-queue";
        channel.queueDeclare(normalQueue, false, false, false, params);
        channel.queueBind(normalQueue, NORMAL_EXCHANGE, "zhangsan");


        System.out.println("Consumer01等待接收消息...");
        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody());
            System.out.println("Consumer01从Q1接受到的消息:"+message);
        };
        //取消消费的一个回调接口 如在消费的时候队列被删除掉了
        CancelCallback cancelCallback = s -> {
            System.out.println("消息被中断");

        };
       channel.basicConsume(normalQueue,true,deliverCallback,cancelCallback);
    }
}

运行:先运行Consumer1, 然后将其关闭,此时打开web管理界面可以看到产生了两个队列,然后开启Consumer02, 然后再开启Producer, 等待10s钟,消息由正常队列移动到了死信队列中
在这里插入图片描述
在这里插入图片描述


3. 队列达到最大长度

生产者代码修改:
在这里插入图片描述
消费者1代码修改:
在这里插入图片描述

运行:启动消费者1,关闭,然后依次启动消费者2和生产者,从运行结果中可以看到消费者2从死信队列中消费了4条消息

在这里插入图片描述


4. 消息被拒

生产者代码和3中一样
修改生产者1代码,取消自动应答,并修改为拒绝消息info5, 同时取消3中设置的队列长度为6
在这里插入图片描述
在这里插入图片描述

运行:启动消费者1,然后启动消费者2,然后启动生产者

在这里插入图片描述
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43478694/article/details/125509433

rabbitmq之死信队列_weixin_34187822的博客-爱代码爱编程

2019独角兽企业重金招聘Python工程师标准>>> DLX ,全称为 Dead-Letter-Exchange,可以称之为死信交换器,也有人称之为死信邮箱。当消息在一个队列中变成死信 (dead message)之后, 它能被重新发送到另一个交换器中,这个交换器就是 DLX ,绑定DLX的队列就称之为死信队

SpringBoot2.0实战(12)整合RabbitMQ之死信队列-爱代码爱编程

相关知识 什么是死信队列 “死信”是RabbitMQ中的一种消息机制,当你在消费消息时,如果队列里的消息出现以下情况: 消息被否定确认,使用 channel.basicNack 或 channel.basicReject ,并且此时requeue 属性被设置为false。消息在队列的存活时间超过设置的TTL时间。消息队列的消息数量已经超过最大队列长度

RabbitMQ之死信队列和延迟队列-爱代码爱编程

死信队列 DLX,全称为 Dead-Letter-EXchange,可以称之为死信交换机,也有人称之为死信邮箱。当消息在一个队列中变成死信( dead message)之后,它能被重新发送到另—个交换机中,这个交换机就是DLX,绑定DLX的队列就称之为死信队列。 消息变成死信,可能是由于以下的原因: 消息被拒绝 消息过期 队列达到最大长度 DL

SpringCloud stream 集成RabbitMQ 之死信队列讲解-爱代码爱编程

                 当消息处理消费失败后,SpringCloud Stream 会自动默认重试3次,重试三次失败后,RepublishMessageRecoverer类recover方法会将改变routingkey为队列名称发送至死信队列。目前产生死信队列有两种方式: 默认自动为每个消息队列产生一个死信队列,消费失败时会路由至

RabbitMQ 之死信队列-爱代码爱编程

文章目录 什么是死信队列如何配置死信队列死信消息的变化死信队列应用场景总结 什么是死信队列 为了保证订单业务的消息数据不丢失,需要使用到RabbitMQ的死信队列机制,当消息消费发生异常时,将消息投入死信队列中。 “死信”是RabbitMQ中的一种消息机制,当你在消费消息时,如果队列里的消息出现以下情况: 消息被否定确认,使用 chann

RabbitMq之死信队列-爱代码爱编程

死信队列 1. 死信的概念 死信,顾名思义就是死掉的信息(无法被消费的信息),一般来说,就是生产者将消息发送给broker(exchange+queue),但由于特定的原因导致queue中的某些消息无法被消费,这样的消息如果没有被处理,就形成了死信,有死信自然就有死信队列,来存放死信。 2. 死信的来源 1.消息TTL时间过期 2.队列达到最大长度

RabbitMQ的死信队列-爱代码爱编程

什么是死信 在 RabbitMQ 中充当主角的就是消息,在不同场景下,消息会有不同地表现。 死信就是消息在特定场景下的一种表现形式,这些场景包括: 消息被拒绝访问,即 RabbitMQ返回 nack 的信号时消息的 TTL 过期时消息队列达到最大长度消息不能入队时。上述场景经常产生死信,即消息在这些场景中时,被称为死信。 什么是死信队列 死信队列就

rabbitmq之死信队列、延迟队列_爱上口袋的天空的博客-爱代码爱编程

一、死信队列 1、简介 死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer将消息投递到 broker或者直接到queue里了,consumer 从 queue取出消息进行消费,但某些时候由于特定的原因导致queue中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信自然就有了死信队列。应用

rabbitmq创建死信队列_一个头发贼多的小火鸡的博客-爱代码爱编程

向Queue_TTL队列里发送消息,10秒后当消息没有被正常消费掉则消息过期被转发至 Queue_DLX死信队列 const amqp = require('amqplib'); async function TTL_production() { var conn = await amqp.connect("amqp://localhost

springboot:整合rabbitmq之死信队列_yololee_的博客-爱代码爱编程

文章目录 springboot:整合rabbitmq之死信队列一、项目准备依赖配置类yaml配置文件二、死信队列介绍三、案例创建生产者和消费者测试结果修改消费者、手动确认重启测试四、总结 springboot:整合rabbitmq之死信队列 一、项目准备 依赖 <dependency>

rabbitmq集群搭建_weixin_39393393的博客-爱代码爱编程

前言: 首先准备好集群环境: 下面要演示的是将node02和node03加入node01的rabbitmq集群中 说明一下三台机器分别部署了rabbitmq版本是: 单机部署就不演示了,想研究的小伙伴可以移步到这里说明的很详细https://blog.csdn.net/Code__rookie/article/details/122829673?spm

什么是mq和认识rabbitmq_eric-x的博客-爱代码爱编程

由于本文为介绍性的内容,所以看起来可能会有点干巴,看之前建议先喝杯水。 文章目录 1、什么是MQ2、为什么要使用MQ3、MQ的分类1、ActiveMQ2、Kafka3、RocketMQ4、RabbitMQ5、MQ的选择4、RabbitMQ1、RabbitMQ的概念2、四大核心概念3、RabbitMQ核心部分4、各个名词介绍总结 1、

【校招vip】 java开源框架之mq_校招vip的博客-爱代码爱编程

考点介绍: MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据结构。一般用来解决应用解耦,异步消息,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性架构。 本期分享的java开源框架之mq,分为试题、文章以及视频三部分。 答案详情解析和文章内容点击下方链接即可查看! 一、考点题目 1.如何保证RabbitMQ

rabbitmq之死信队列篇_10分之9+9分之1-爱代码爱编程

1 死信的概念   先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的信息,字面意思可以这样理解,一般来说,producer 将消息投递到 broker 或者直接到 queue 里了,consumer 从 que

kafka基本知识概述_linux kafka-爱代码爱编程

一、概述 1、什么是MQ 消息中间件,通过消息的发送和消息的接收分离实现应用程序的解耦,但是这个是MQ的效果并非目的,真正的目的是为了通讯,屏蔽底层复杂的通讯协议,定义一套更加简单的通讯,一个分布式系统中两个模块之间通讯要么是HTTP,要么是自己开发的(rpc) TCP,但是这两种协议其实都是原始的协议。HTTP 协议很难实现两端通讯——模块 A 可以

emqx安装教程-爱代码爱编程

下载地址 官网地址 https://www.emqx.io/docs/zh/v4.4/ Erlang 下载地址:https://www.erlang.org/downloads. 版本可以对照官网:https://ww