高级特性之RabbitMQ消息确认机制ACK

DBC 1.6K 0

简介:Rabbitmq的消息确机制ACK讲解

背景:消费者从broker中监听消息,需要确保消息被合理处理

RabbitMQ的ACK介绍

消费者从RabbitMQ收到消息并处理完成后,反馈给RabbitMQ,RabbitMQ收到反馈后才将此消息从队列中删除
消费者在处理消息出现了网络不稳定、服务器异常等现象,那么就不会有ACK反馈,RabbitMQ会认为这个消息没有正常消费,会将消息重新放入队列中
只有当消费者正确发送ACK反馈,RabbitMQ确认收到后,消息才会从RabbitMQ服务器的数据中删除。
消息的ACK确认机制默认是打开的,消息如未被进行ACK的消息确认机制,这条消息被锁定Unacked
确认方式

自动确认(默认)
手动确认 manual

先在配置文件添加一下代码
    #开启手动确认消息,如果消息重新入队,进行重试
    listener:
      simple:
        acknowledge-mode: manual  

这一步之后咱们就已经是手动确认消息了,可以看到消息消费了却没有通知!

高级特性之RabbitMQ消息确认机制ACK插图
接下来就是进行手动确认消息了

高级特性之RabbitMQ消息确认机制ACK插图2

  /**
     * 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。

人工审核异常消息

设置重试阈值,超过后确认消费成功,记录消息,人工处理

发表评论 取消回复
表情 图片 链接 代码

分享