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

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

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

RabbitMQ中消费者对死信队列的处理_第1张图片

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

代码实现

设置重试次数

RabbitMQ中消费者对死信队列的处理_第2张图片

关联死信队列

需要将一个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");
    }

}

测试

模拟异常

RabbitMQ中消费者对死信队列的处理_第3张图片

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

RabbitMQ中消费者对死信队列的处理_第4张图片

处理死信队列

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

RabbitMQ中消费者对死信队列的处理_第5张图片

你可能感兴趣的:(RabbitMQ)