• 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
  • 相关阅读:
    软件工程第四次作业
    软件工程第三次作业
    图片
    软件工程第二次作业
    软件工程第一次作业
    我的大学生活-3-35-任延勇
    我的未来只有我知道
    cpu占用率高排查知识点
    LeetCode字符串题目
    hashmap
  • 原文地址:https://www.cnblogs.com/tianhengblogs/p/15343601.html
Copyright © 2020-2023  润新知