ack的设置
springboot项目 如果没有指定 rabbitmq 的应答方式,默认是自动应答,这样即使程序在处理消息 process过程中出现异常,这个消息也是被消费掉的。
为了保证消息的可靠性这里推荐采用手动方式应答,即通过代码实现。
ack配置
spring.rabbitmq.listener.acknowledge-mode: MANUAL
手动签收,并回馈信息给MQ
Long deliverTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);
channel.basicAck(deliverTag, false);
消息unack 的异常出现场景
如若处理过程中出现异常,而没有回复ack 应答。通过后台就会看到有 unacked 的数据。
如果积压的多会导致程序无法继续消费数据(数量和消费者的线程数有关)。
解决办法 针对异常 做处理,捕捉到后 也回复ack应答。程序断开于rabbitmq的链接后 unacked的消息状态会重新变为ready 等待消费。
代码更新后,server应用连接rabbitmq 就会重新消费掉消息。