一。介绍
1.消费者从RabbitMQ收到消息并处理完成后,反馈给RabbitMQ,RabbitMQ收到反馈后才将此消息从队列中删除
2.消费者在处理消息出现了网络不稳定、服务器异常等现象,那么就不会有ACK反馈,RabbitMQ会认为这个消息没有正常消费,会将消息重新放入队列中
3.只有当消费者正确发送ACK反馈,RabbitMQ确认收到后,消息才会从RabbitMQ服务器的数据中删除。
4.消息的ACK确认机制默认是打开的,消息如未被进行ACK的消息确认机制,这条消息被锁定Unacked
二。确认方式
1.自动确认(默认)
2.手动确认 manual
spring:
rabbitmq:
#开启手动确认消息
listener:
simple:
acknowledge-mode: manual
3.两种方式区别
转载:
非常好理解的推文
https://www.cnblogs.com/refuge/p/10356750.html
三。deliveryTag介绍
表示消息投递序号,每次消费消息或者消息重新投递后, deliveryTag都会增加
四。basicNack和basicReject介绍
1.basicReject一次只能拒绝接收一个消息,可以设置是否requeue。
2.basicNack方法可以支持一次0个或多个消息的拒收,可以设置是否requeue。
用处举例:
人工审核异常消息:
设置重试阈值,超过后确认消费成功,记录消息,人工处理
代码:
部分代码可参考:
https://www.cnblogs.com/tianhengblogs/p/15341670.html
https://www.cnblogs.com/tianhengblogs/p/15342226.html
import com.rabbitmq.client.Channel; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; import java.io.IOException; @Component @RabbitListener(queues = "order_queue") public class OrderMQListener { /** * body: 接收onvertAndSend(String exchange, String routingKey, Object object)的order消息 * * */ @RabbitHandler public void messageHandler(String body, Message message, Channel channel) throws IOException { long msgTag = message.getMessageProperties().getDeliveryTag(); System.out.println("body: " + body); System.out.println("msgTag: " + msgTag); System.out.println("message: " + message.toString()); //告诉broker(消息队列服务器实体),消息已经被确认 channel.basicAck(msgTag, false); //告诉broker,消息拒绝确认(可以拒绝多条,把比当前msgTag值小的也拒绝) // channel.basicNack(msgTag, false, true); //告诉broker,消息拒绝确认(只能拒绝当前msgTag的这条) // channel.basicReject(msgTag, true); } }