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