RabbitMQ------ACK确认机制

一。介绍

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

 

posted @ 2021-09-27 16:39  玉天恒  阅读(1231)  评论(0编辑  收藏  举报