死信队列解释:

出现死信队列的情况:

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

配置死信队列步骤:

代码如下:


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);
    }
}
12-29 20:36