简介:Rabbitmq的消息确机制ACK讲解
背景:消费者从broker中监听消息,需要确保消息被合理处理
RabbitMQ的ACK介绍
消费者从RabbitMQ收到消息并处理完成后,反馈给RabbitMQ,RabbitMQ收到反馈后才将此消息从队列中删除
消费者在处理消息出现了网络不稳定、服务器异常等现象,那么就不会有ACK反馈,RabbitMQ会认为这个消息没有正常消费,会将消息重新放入队列中
只有当消费者正确发送ACK反馈,RabbitMQ确认收到后,消息才会从RabbitMQ服务器的数据中删除。
消息的ACK确认机制默认是打开的,消息如未被进行ACK的消息确认机制,这条消息被锁定Unacked
确认方式
自动确认(默认)
手动确认 manual
先在配置文件添加一下代码
#开启手动确认消息,如果消息重新入队,进行重试
listener:
simple:
acknowledge-mode: manual 这一步之后咱们就已经是手动确认消息了,可以看到消息消费了却没有通知!

接下来就是进行手动确认消息了




/**
* RabbitHandler 会自动匹配 消息类型(消息自动确认)
* @param msg
* @param message
* @throws IOException
*/
@RabbitHandler
public void releaseCouponRecord(String msg, Message message, Channel channel) throws IOException {
long msgTag = message.getMessageProperties().getDeliveryTag();
System.out.println("msgTag="+msgTag);
System.out.println("message="+message.toString());
System.out.println("监听到消息:消息内容:"+ Arrays.toString(message.getBody()));
//告诉broker,消息已经被确认
//channel.basicAck(msgTag,false);
//告诉broker,消息已经被拒绝
channel.basicNack(msgTag,false,true);
} deliveryTag介绍
表示消息投递序号,每次消费消息或者消息重新投递后, deliveryTag都会增加
basicNack和basicReject介绍
basicReject一次只能拒绝接收一个消息,可以设置是否requeue。
basicNack方法可以支持一次0个或多个消息的拒收,可以设置是否requeue。
人工审核异常消息
设置重试阈值,超过后确认消费成功,记录消息,人工处理
本文作者为DBC,转载请注明。