代码编织梦想

  一、介绍

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

       应用场景:为了保证订单业务的消息数据不丢失,需要使用到RabbitMQ的死信队列机制,当消息消费发生异常时,将消息投入死信队列中,还有比如说:用户在商城自动下单成功并点击去支付后在指定时间未支付时自动失效。

  二、来源

         1、消息TTL过期

         2、队列达到最大长度(队列满了,无法再添加数据到mq中)

         3、消息被拒绝(basic.reject或basic.nack)并且requeue=false

  三、代码

        生产者

public class Producer {
    //普通交换机的名称
    public static final String NORMAL_EXCHANGE= "normal_exchange";

    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMqUtil.getChannel();
        //延迟消息 设置TTL
        AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().expiration("10000").build();
        for (int i = 0; i < 11; i++) {
            String message = i+"";
            channel.basicPublish(NORMAL_EXCHANGE,"zhangsan",properties,message.getBytes());
        }
    }
}

        正常消费者

public class Consumer01 {
    //普通交换机的名称
    public static final String NORMAL_EXCHANGE= "normal_exchange";
    //死信交换机
    public static final String DEAL_EXCHANGE= "deal_exchange";
    //普通队列名称
    public static final String NORMAL_QUEUE = "normal_queue";
    //死信队列名称
    public static final String DEAL_QUEUE= "deal_queue";

    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMqUtil.getChannel();
        //声明死信和普通交换机类型为direct
        channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);
        channel.exchangeDeclare(DEAL_EXCHANGE, BuiltinExchangeType.DIRECT);
        //声明普通和死信队列
        Map<String, Object> arguments = new HashMap<>();
        //过期时间
        //arguments.put("x-message-ttl",10000);
        //正常队列设置死信交换机
        arguments.put("x-dead-letter-exchange",DEAL_EXCHANGE);
        //设置死信routingKey
        arguments.put("x-dead-letter-routing-key","lisi");
        channel.queueDeclare(NORMAL_QUEUE,false,false,false,arguments);
        //============================================
        channel.queueDeclare(DEAL_QUEUE,false,false,false,null);

        //绑定普通的交换机和队列
        channel.queueBind(NORMAL_QUEUE,NORMAL_EXCHANGE,"zhangsan");
        //绑定死信的交换机与队列
        channel.queueBind(DEAL_QUEUE,DEAL_EXCHANGE,"lisi");
        System.out.println("等待接收消息......");
        //接收消息
        channel.basicConsume(NORMAL_QUEUE,false,(consumerTag,message)->{
            System.out.println("consumer1接收的消息内容是:"+new String(message.getBody()));
        },(consumerTag)->{

        });
    }
}

        死信消费者

public class Consumer02 {
    //死信队列名称
    public static final String DEAL_QUEUE= "deal_queue";

    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMqUtil.getChannel();

        System.out.println("等待接收消息......");
        //接收消息
        channel.basicConsume(DEAL_QUEUE,false,(consumerTag,message)->{
            System.out.println("consumer2接收的消息内容是:"+new String(message.getBody()));
        },(consumerTag)->{

        });
    }
}
  四、队列达到最大长度

       声明正常队列时添加如下参数,并删掉旧队列重新创建 

 //设置正常队列长度限制
 arguments.put("x-max-length",6);
  五、消息被拒

        将自动应答修改为手动应答

//接收消息
        channel.basicConsume(NORMAL_QUEUE,false,(consumerTag,message)->{
            String msg = new String(message.getBody());
            if(msg.equals("5")){
                System.out.println("consumer1拒绝的消息内容是:"+msg);
                channel.basicReject(message.getEnvelope().getDeliveryTag(),false);
            }else{
                System.out.println("consumer1接收的消息内容是:"+msg);
                channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
            }

        },(consumerTag)->{

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

RabbitMQ学习之路 - 死信队列简单实现-爱代码爱编程

RabbitMQ学习之路 -死信队列简单实现 一、死信队列介绍 死信队列是RabbitMQ中的一种消息机制,当你在消费消息时,如果队列里的消息出现以下情况: 消息被否定确认,使用 channel.basicNack 或 channel.basicReject ,并且requeue 属性被设置为false。消息在队列的存活时间超过设置的TTL时间。消息

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

RabbitMq死信队列有三种发生情况: 消息 TTL 过期队列达到最大长度(队列满了,无法再添加数据到 mq 中)消息被拒绝(basic.reject 或 basic.nack)并且 requeue=false. 生产者: import com.cn.mq.utils.ConnectionMq; import com.rabbitmq.client.

07-rabbitMQ-死信队列-爱代码爱编程

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

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

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

rabbitmq-死信队列(死信交换机)(十)-爱代码爱编程

消息进入死信队列的条件 队列消息数量到达限制;比如给队列最大只能存储10条消息,当第11条消息进来的时候存不下了,第11条消息就被称为死信消费者拒接消费消息,basicNack/basicReject,并且不把消息重新放入原目标队列,requeue=false;原队列存在消息过期设置,消息到达超时时间未被消费;队列绑定死信交换机(重点,也就是在正常队

RabbitMQ-Java-05-死信队列-爱代码爱编程

说明 RabbitMQ-Java-05-死信队列本案例是一个Maven项目假设你已经实现了上一节发布订阅模式官方文档已包含绝大多数本案例内容。请移步:https://docs.spring.io/spring-amqp/docs/current/reference/html/核心概念 》死信来源 消息TTL过期队列满了消息被拒绝》死信实现过程概览

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

这里的描述来自官方: 死信交换 来自队列的消息可以是“死信”;也就是说,当发生以下任何事件时,重新发布到交易所: 消费者使用basic.reject或 basic.nack否定确认消息,并将requeue参数设置为false。消息由于每条消息的 TTL而过期消息被丢弃,因为它的队列超过了长度限制请注意,队列到期不会死信其中的消息。 死信交换 (DL

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

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

rabbitmq高级特性-死信队列和延迟队列_blueeyedboy521的博客-爱代码爱编程

目录 一、初识死信交换机二、如何绑定死信交换机三、TTL1、应用场景2、申明延迟消息的消费者3、申明死信队列4、测试发送消息四、延迟队列1、使用场景2、安装DelayExchange插件3、管理平台使用在RabbitMQ的管理平台声明一个DelayExchage消息的延迟时间需要在发送消息的时候指定4、SpringAMQP使用延迟队列插件基于注解基

rabbitmq-死信队列、延迟队列(原生+springboot+插件实现)_萌萌虎儿的博客-爱代码爱编程

目录 一、死信队列 1.1 概念 1.2 来源 1.3 演示 二、延迟队列 2.1 TTL-消息最大存活时间 2.2 在SpringBoot中演示延迟队列与死信队列 2.2.1 基本演示 2.2.2 优化-动态设置TTL 2.2.3 使用插件实现延迟队列 2.3 总结 一、死信队列 1.1 概念        死信顾名思义

rabbitmq-死信队列_插肩而过放个p的博客-爱代码爱编程

死信队列 死信的概念 顾名思义就是无法被消费的消息,一般来说,producer 将消息投递到 broker 或者直接到 queue 里了,consumer 从 queue 取出消息进行消费,但某些时候由于特定的原因导致

rabbitmq学习-死信队列_子非吾喵的博客-爱代码爱编程

死信队列 死信:顾名思义就是无法被消费的消息,一般情况下,product将消息投递到broker或者直接到queue里,consumer从queue取出消息,进行消费,但某些时候由于特定的原因导致queue中的某些消息无法

rabbitmq - 死信队列_jm呀的博客-爱代码爱编程

文章目录 1. 死信的概念2. 死信的来源3. 死信实战3.1 死信之TTl3.2 死信之最大长度3.3 死信之消息被拒 1. 死信的概念 先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息

rabbitmq-持久化-爱代码爱编程

  一、介绍          如何保证RabbitMQ服务停掉以后生产者发送过来的消息不丢失。默认情况下RabbitMQ退出或由于某种原因崩溃时,他将忽视队列和消息,除非告知它不要这样做。确保消息不丢失需要做两件事情:将队列和消息都标记为持久化   二、队列持久化         再声明队列的时候把durable参数改为true即可 bool

win10 安装rabbitmq详细步骤-爱代码爱编程

win10 安装rabbitMQ详细步骤 win10 安装rabbitMQ详细步骤 win10 安装rabbitMQ详细步骤一、下载安装程序二、安装配置erlang三、安装rabbitMQ四、验证初始可以通过用户名

rabbitmq-爱代码爱编程

RabbitMQ–集成Springboot–07–死信交换机和死信队列配置 1、死信交换机和队列配置 1.1、配置 import lombok.extern.slf4j.Slf4j; import org.spri