RabbitMQ重试机制触发的条件:
1. 消费者程序出现异常
例如:
throw new RuntimeException("测试重试消息");
此时mq会根据配置文件设定的重试策略进行重试。
2. 手动告诉mq签收失败
例如:
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
此时消费者告诉mq消费失败,并将该消息重新放回队列等待下次消费,如果消费者是单台时会出现死循环。
(从 api 的说明来看,这个就是循环消费和重试机制无关,但测试发现,开启重试策略,同样的消息再次投递到消费者的频率明显比关闭重试高很多,所以将这种情况也归纳为RabbitMQ重试机制触发的条件)
同时绑定死信队列和开始重试机制
1. 消费者程序出现异常
消费队列会进行重试直到达到重试次数为止,但是消息不会进入到死信队列进行消费。
2. 手动告诉mq签收失败
2.1 当channel.basicNack 第三个参数设为true时,消息签收失败会继续进入消息队列等待消费
2.2 当channel.basicNack 第三个参数设为false时,消息签收失败,此时消息进入死信队列,完成消费
正常队列消费者:
死信队列消费者: