RabbitMQ-死信队列

接上文 RabbitMQ-java使用消息队列

1 死信队列简介


死信队列模式实际上本质是一个死信交换机+绑定的死信队列,当正常队列的消息被判定为死信时,会被发送到对应的死信交换机,然后再通过交换机发送到死信队列中,死信队列也有对应的消费者去处理消息。

1.1 测试第一种(消息被拒绝)

直接在配置类中创建一个新的死信交换机和死信队列,并进行绑定:

bash 复制代码
@Configuration
public class RabbitConfiguration {

    @Bean("directDlExchange")
    public Exchange dlExchange(){
        //创建一个新的死信交换机
        return ExchangeBuilder.directExchange("dlx.direct").build();
    }

    @Bean("yydsDlQueue")   //创建一个新的死信队列
    public Queue dlQueue(){
        return QueueBuilder
                .nonDurable("dl-yyds")
                .build();
    }

    @Bean("dlBinding")   //死信交换机和死信队列进绑定
    public Binding dlBinding(@Qualifier("directDlExchange") Exchange exchange,
                           @Qualifier("yydsDlQueue") Queue queue){
        return BindingBuilder
                .bind(queue)
                .to(exchange)
                .with("dl-yyds")
                .noargs();
    }

		...

    @Bean("yydsQueue")
    public Queue queue(){
        return QueueBuilder
                .nonDurable("yyds")
                .deadLetterExchange("dlx.direct")   //指定死信交换机
                .deadLetterRoutingKey("dl-yyds")   //指定死信RoutingKey
                .build();
    }
  
  	...
}


删除rabbitmq管理页面的队列,关之前把springboot的application启动类关闭,否则删除完队列马上又创建新的队列

定义死信队列监听

bash 复制代码
@Component
public class TestListener {
    @RabbitListener(queues = "dl-yyds", messageConverter = "jacksonConverter")
    public void receiver(User user){
        System.out.println(user);
    }
}

启动服务器application。进入rabbitmq网页管理端,可以看到出现两个队列。

查看交换机

查看dlx.direct交换机详情

向amq.direct交换机发送消息{"id":1,"name":"LB"}


此时yyds队列出现一条消息

将消息拒绝使其变为死信消息。

此时死信队列监听到拒绝的信息

1.1 测试第二种(消息TTL过期)

RabbitMQ支持将超过一定时间没被消费的消息自动删除,这需要消息队列设定TTL值,若消息的存活时间超过了Time To Live值,则会被自动删除,自动删除后的消息若有死信队列,则会进入死信队列。
给yyds队列设定TTL值(毫秒为单位):先把服务器关闭,然后删除队列yyds


启动服务,然后在amq.direct交换机详情发送消息{"id":1,"name":"LB"}

不进行处理5s后死信队列会监听到消息

1.1 测试第三种(队列达到最大长度)

关闭服务,删除yyds,在配置类添加参数,然后启动服务



同样在amq.direct交换机发送消息,发送三次消息分别为{"id":1,"name":"LB"},{"id":2,"name":"LB"},{"id":3,"name":"LB"}

此时消息队列3条消息

此时死信队列未监听到数据

然后再发送一条{"id":4,"name":"LB"}

然后发现死信队列监听器监听到消息,此时第四条消息把第一条挤出去了。

此时yyds队列还剩下三条消息

相关推荐
PingCAP16 小时前
善战者无赫赫之功:消费金融核心系统的数据库选型与升级路径
数据库·分布式·架构
库库的数据库笔记17 小时前
金融核心交易系统的数据库国产信创改造该如何做?
大数据·数据库·分布式·mysql·oracle·金融·数据库架构
爱吃火鸡面呀1 天前
深入理解 Spark RDD:五大特性与实战解析
大数据·分布式·spark
Linux实战笔记1 天前
记一次消息队列选型对比线上排查:Kafka/RabbitMQ/Pulsar 技术选型
kafka·rabbitmq·高并发·pulsar·消息队列选型
Norris Huang1 天前
Kafka Connect 与 Flink CDC 写入 Iceberg:Upsert 的代价,以及 S3 Tables 的真正价值
分布式·flink·kafka
张彦峰ZYF1 天前
一条消息的丢与重:Kafka 与 RabbitMQ 可靠投递的确认、位点、死信与幂等全链路
后端·kafka·消息队列·rabbitmq·isr·解耦与削峰·丢失与重复
我就是不信1 天前
集群高并发环境下如何保证分布式唯一全局ID生成?
分布式
黄俊懿2 天前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式
java·服务器·数据库·分布式·性能优化·架构·系统架构
大菠萝爱上小西瓜2 天前
基于 Spark + Iceberg 湖仓一体的 Netflix 流媒体用户行为全链路数仓与 ALS 智能推荐决策系统(含穿透下钻大屏)
大数据·分布式·spark
吴建旭 智宅焕2 天前
智能家居售后服务体系的架构设计:分布式售后风险的集中式兜底方案
分布式·智能家居