问题
:::tips 在失败重试策略中,默认的RejectAndDontRequeueRecoverer会在本地重试次数耗尽后发送reject给RabbitMQ,消息会变成死信被丢弃
所以可以给队列添加一个死信交换机,给死信交换机绑定一个死信队列,这样消息变成死信后也不会丢弃,而是最终投递到死信交换机,路由到与死信交换机绑定的死信队列
:::
编写代码
:::tips 在消息消费者中声明普通队列、死信交换机、死信队列,并声明绑定死信交换机和死信队列,当普通队列中的消息变成死信后就会被投递给死信交换机,死信交换机通过路由key再将死信路由给死信队列 :::
@Configuration
public class XxxConfig{
//声明普通队列,并指定消息变成死信后发送给哪个死信交换机
@Bean
public Queue simpleQueue(){
return QueueBuilder
.durable("simple.queue") //指定队列名称,并持久化
.deadLetterExchange("dl.direct") //指定消息变成死信后发送给哪个死信交换机
.build();
}
//声明死信交换机
@Bean
public DirectExchange dlExchange(){
return new DirectExchange("dl.direct", true, false);
}
//声明死信队列
@Bean
public Queue dlQueue(){
return new Queue("dl.queue", true);
}
//声明绑定死信队列与死信交换机
@Bean
public Binding dlBinding(Queue dlQueue, DirectExchange dlExchange){
return BindingBuilder.bind(dlQueue).to(dlExchange).with("dead");
}
}