什么是RabbitMQ死信队列?如何实现?

死信队列解释:

RabbitMQ的死信队列(DEAD Letter Queue,简称DLQ),是一种用于消息处理失败或者无法路由的机制。它允许将无法正常消费的消息路由到另一个队列,以便于后续处理、排查。

出现死信队列的情况:

1、消息处理失败:消息没有正常被消费,消费代码出现异常无法正常处理一条消息时,该条消息可以标记为死信。

2、消息过期:RabbitMQ中消息可以设置过期时间,如果在规定时间内没有被消费,它可以被认为是死信并被发送到死信队列。

3、消息被拒绝:当消费者明确拒绝一条消息时,它可以被标记为死信并发送到死信队列。

4、消息无法路由:当消息不能被路由到任何队列时,例:没有绑定关系或者是路由键,消息可以被发送到死信队列。

当消息变成“死信”之后,如果配置了死信队列,那么它将会被发送到死信交换机,死信交换机将死信发送到一个队列上,这个队列就是死信队列。如果没有配置死信队列,那么这个消息将会被丢弃。

配置死信队列步骤:

1、创建死信队列:用来存储死信消息的队列

2、创建死信交换机:定义一个死信交换机

3、死信队列和死信交换机进行绑定:将死信队列和死信交换机进行绑定,以便消息发送到死信队列上

4、在主队列上配置死信属性:通过设置"x-dead-letter-exchange","x-dead-letter-routing-key"属性指定死信消息应该被发送到那个交换机和路由键

代码如下:


import org.springframework.amqp.core.*;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.*;

@Configuration
public class RabbitmqConfig {

    //配置死信队列和死信交换机
    @Bean
    public DirectExchange directExchange(){
        return new DirectExchange("dead-letter-change");
    }
    //配置死信队列
    @Bean
    public Queue deadLetterQueue(){
        return new Queue("dead-letter-queue");
    }
    //死信队列绑定死信交换机
    @Bean
    public Binding deadLetterBinding(){

        return BindingBuilder.bind(deadLetterQueue()).to(directExchange()).with("dead-letter-routing-key");
    }

    //主队列的交换机
    @Bean
    public DirectExchange mainExchange(){
        return new DirectExchange("main-exchange");
    }
    //主队列
    @Bean
    public Queue mainQueue(){
        Map<String,Object> args = new HashMap<>();
        //声明当前队列绑定的死信交换机
        args.put("x-dead-letter-exchange","dead-letter-change");
        //声明当前队列绑定的死信路由key
        args.put("x-dead-letter-routing-key","dead-letter-routing-key");

        return QueueBuilder.durable("main-queue").withArguments(args).build();
    }
    //绑定主队列到主交换机
    @Bean
    public Binding binding(){

        return BindingBuilder.bind(mainQueue()).to(mainExchange()).with("main-routing-key");
    }
}

消费者分别监听主队列和死信队列(代码如下):

//消费者监听死信队列

@Component
public class DeadLetterMsgReceiver {

    @RabbitListener(queues = "dead-letter-queue")
    public void receiverA(Message message, Channel channel) throws IOException {
        System.out.println("死信消息:"+new String(message.getBody()));
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
    }
}

//消费者监听主队列
@Component
public class MainMsgReceiver {

    @RabbitListener(queues = "main-queue")
    public void receiverA(Message message, Channel channel) throws IOException {
        System.out.println("普通消息:"+new String(message.getBody()));
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
    }
}

相关推荐

  1. 什么RabbitMQ死信队列如何实现

    2023-12-29 17:28:02       56 阅读
  2. RabbitMQ——死信队列

    2023-12-29 17:28:02       42 阅读
  3. RabbitMQ死信队列

    2023-12-29 17:28:02       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-29 17:28:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-29 17:28:02       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-29 17:28:02       87 阅读
  4. Python语言-面向对象

    2023-12-29 17:28:02       96 阅读

热门阅读

  1. leetcode 复原ip、子集

    2023-12-29 17:28:02       55 阅读
  2. 17-网络安全框架及模型-信息流模型(FM)

    2023-12-29 17:28:02       55 阅读
  3. HarmonyOS-module.json5配置文件

    2023-12-29 17:28:02       51 阅读
  4. 分享相关知识

    2023-12-29 17:28:02       47 阅读
  5. centos 安装 zlib 库

    2023-12-29 17:28:02       59 阅读
  6. mysql8.0安装

    2023-12-29 17:28:02       47 阅读
  7. spring-session升级之坑

    2023-12-29 17:28:02       49 阅读
  8. 把form表单数据转为json,并传给父页面

    2023-12-29 17:28:02       61 阅读
  9. 收集巧克力(LeetCode日记)

    2023-12-29 17:28:02       48 阅读
  10. Springboot应用中@EntityScan和@EnableJpaRepositories的用法

    2023-12-29 17:28:02       63 阅读
  11. react pwa应用示例

    2023-12-29 17:28:02       54 阅读
  12. Vue中等待两个异步请求完成解决方式记录

    2023-12-29 17:28:02       56 阅读
  13. 【Redis】Redis 的数据类型

    2023-12-29 17:28:02       56 阅读
  14. Redis和Memcached有什么区别?

    2023-12-29 17:28:02       55 阅读