本文用于解答下述疑问:
消息在下面四个条件的处理方式:
- 两种模式
- 是否有异常、是否捕获异常
- 是否设置重试
requeue
为true / false
( +default-requeue-rejected
的影响)
看似是 2 4 种方案,让人头疼,但其实没那么复杂。总结中也会给出简洁的答案。
正文
本文环境: springboot 2.1.9.RELEASE + amqp-client-5.4.3.jar
本文内容都是 direct
相关的配置,这里的direct
不是指直连模式的那个,而是指springbbot配置中rabbitMQ的属性。
即application.properties
的配置
#注意用direct要声明
spring.rabbitmq.listener.type=direct
#是direct
spring.rabbitmq.listener.direct.xxxx
#而不是 spring.rabbitmq.listener.simple.xxxx
不了解两者区别的可以参考一下RabbitMQ传输原理、五种模式
本文所说的模式仅限于auto
和manual
两种,none
不做讨论(毕竟就是"不管")
本文也不讨论这两种模式的优缺点,(auto时,源源不断地发送消息之类)
为简化讨论,"异常"只分两种: (这也是JVM处理的逻辑)
- 没有异常 和 有异常捕获了,都视为没有异常
- 有异常, 或者 捕获了异常再抛出、手动抛出,都视为有异常
(补充:全局异常处理器无法生效,只看该方法内有没有抛出)
首先前置知识:
-
RabbitMQ对异