消费端 ACK 和 NACK
消费端消费消息的时候,出现了一般异常可以进行日志记录后续进行补偿处理,但是如果在处理消息时服务器出现了宕机,这时候就会丢失消息。rabbitmq 提供了手动签收机制,消费端向 broker 回复 ack 信号,确认消息是否已经消费。如果确认消费,broker 才会将消息删除,不确认消费的话,消费者恢复正常之后,broker 会再次投递该消息。此外,消费端处理异常的话,也可以回复 broker 一个 nack 信号将消息重回队列,broker 会再次投递该消息。
channel.basicAck
void basicAck(long deliveryTag, boolean multiple) throws IOException;
- deliveryTag:该消息的index;
- multiple:是否批量,如果为 true,将一次性ack所有小于deliveryTag的消息;确认收到消息。
channel.basicNack
void basicNack(long deliveryTag, boolean multiple, boolean requeue) throws IOException;
- deliveryTag:该消息的index;
- multiple:是否批量,如果为 true,将一次性ack所有小于deliveryTag的消息;确认收到消息;
- requeue:是否重回队列,true 重回队列,false 消息就直接丢弃了。
手动确认实现
添加配置
# 设置手动签收
spring.rabbitmq.listener.simple.acknowledge-mode=manual
编码实现
@Service
@Slf4j
public class MsgListener {
@RabbitListener(queues = "testDirectRouting")
public void listen(String object, Message message, Channel channel) {
try {
MessageProperties messageProperties = message.getMessage