RabbitMQ中消费者对死信队列的处理

不做任何处理会出现的问题

如果不做任何处理,当消费消息时出现异常,默认会不断的重试,这显然不是我们希望的

在这里插入图片描述

我们希望的是:可以指定重试的次数,重试完了之后进入死信队列,然后就可以人为的对死信队列进行处理

代码实现

设置重试次数

在这里插入图片描述

关联死信队列

需要将一个Queue关联死信队列的Exchange和RoutingKey

package com.wcong.config;

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

/**
 * @author wcong
 * @version 1.0
 * @date 2020-07-30 21:01
 */
@Configuration
public class EmailDlConfig {

    /**
     * 正常的消息消息交换机
     * @return
     */
    @Bean
    public DirectExchange emailExchange(){
        return new DirectExchange("EmailExchange");
    }

    /**
     * 用来做死信队列的交换机
     * @return
     */
    @Bean
    public DirectExchange emailDlExchange(){
        return new DirectExchange("emailDlExchange");
    }

    /**
     * 正常的Queue,关联死信队列的Exchange和RoutingKey
     * @return
     */
    @Bean
    public Queue emailQueue(){
        return QueueBuilder.durable("emailQueue")
//                关联死信队列的交换机和RoutingKey
                .withArgument("x-dead-letter-exchange","emailDlExchange")
                .withArgument("x-dead-letter-routing-key","emailDlRouting")
                .build();
    }

    /**
     * 用来做死信队列的Queue
     * @return
     */
    @Bean
    public Queue emailDlQueue(){
//        默认也是持久化的
        return new Queue("emailDlQueue",true);
    }

    /**
     * 正常路由
     * @return
     */
    @Bean
    public Binding emailBinding(){
        return BindingBuilder.bind(emailQueue()).to(emailExchange()).with("emailRouting");
    }

    /**
     * 私信队列的路由
     * @return
     */
    @Bean
    public Binding emailDlBinding(){
        return BindingBuilder.bind(emailDlQueue()).to(emailDlExchange()).with("emailDlRouting");
    }

}

测试

模拟异常

在这里插入图片描述

可看到多次重试后的消息进入了死信队列

在这里插入图片描述

处理死信队列

1、通过人工去处理死信队列
2、等待系统正常后把死信队列中的消息路由到Queue去处理

在这里插入图片描述

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值