一。介绍
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);
}
}
View Code
Original: https://www.cnblogs.com/tianhengblogs/p/15343601.html
Author: 玉天恒
Title: RabbitMQ——ACK确认机制
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/540205/
转载文章受原作者版权保护。转载请注明原作者出处!