死信队列解释:
出现死信队列的情况:
当消息变成“死信”之后,如果配置了死信队列,那么它将会被发送到死信交换机,死信交换机将死信发送到一个队列上,这个队列就是死信队列。如果没有配置死信队列,那么这个消息将会被丢弃。
配置死信队列步骤:
代码如下:
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);
}
}