问题

:::tips 在失败重试策略中,默认的RejectAndDontRequeueRecoverer会在本地重试次数耗尽后发送reject给RabbitMQ,消息会变成死信被丢弃

所以可以给队列添加一个死信交换机,给死信交换机绑定一个死信队列,这样消息变成死信后也不会丢弃,而是最终投递到死信交换机,路由到与死信交换机绑定的死信队列
image.png :::

编写代码

:::tips 在消息消费者中声明普通队列、死信交换机、死信队列,并声明绑定死信交换机和死信队列,当普通队列中的消息变成死信后就会被投递给死信交换机,死信交换机通过路由key再将死信路由给死信队列 :::

  1. @Configuration
  2. public class XxxConfig{
  3. //声明普通队列,并指定消息变成死信后发送给哪个死信交换机
  4. @Bean
  5. public Queue simpleQueue(){
  6. return QueueBuilder
  7. .durable("simple.queue") //指定队列名称,并持久化
  8. .deadLetterExchange("dl.direct") //指定消息变成死信后发送给哪个死信交换机
  9. .build();
  10. }
  11. //声明死信交换机
  12. @Bean
  13. public DirectExchange dlExchange(){
  14. return new DirectExchange("dl.direct", true, false);
  15. }
  16. //声明死信队列
  17. @Bean
  18. public Queue dlQueue(){
  19. return new Queue("dl.queue", true);
  20. }
  21. //声明绑定死信队列与死信交换机
  22. @Bean
  23. public Binding dlBinding(Queue dlQueue, DirectExchange dlExchange){
  24. return BindingBuilder.bind(dlQueue).to(dlExchange).with("dead");
  25. }
  26. }