zoukankan      html  css  js  c++  java
  • RabbitMQ之消费接收确认机制

     RabbitMQ的消息确认机制有两种:

    1)消息发送确认

    这种是用来确认生产者将消息发送给交换器,交换器传递给队列的过程中,消息是否成功投递。发送确认分为两步,一是确认是否到达交换器,二是确认是否到达队列。

    ConfirmCallback 

    通过实现ConfirmCallBack接口,消息发送到交换器Exchange后触发回调。
    
    使用该功能需要开启确认,spring-boot中配置如下: 

    spring.rabbitmq.publisher-confirms = true

    ReturnCallback

    通过实现ReturnCallback接口,如果消息从交换器发送到对应队列失败时触发(比如根据发送消息时指定的routingKey找不到队列时会触发)
    
    使用该功能需要开启确认,spring-boot中配置如下:
    
    spring.rabbitmq.publisher-returns = true

    2)是消费接收确认

    这种是确认消费者是否成功消费了队列中的消息。

    确认模式

    AcknowledgeMode.NONE:不确认
    
    AcknowledgeMode.AUTO:自动确认
    
    AcknowledgeMode.MANUAL:手动确认
    
    spring-boot中配置方法:
    
    spring.rabbitmq.listener.simple.acknowledge-mode = manual

    手动确认

    未确认的消息数

    上图为channel中未被消费者确认的消息数。

    通过RabbitMQ的host地址加上默认端口号15672访问管理界面。

    (2.1)成功确认

    void basicAck(long deliveryTag, boolean multiple) throws IOException;
    
    deliveryTag:该消息的index
    
    multiple:是否批量. true:将一次性ack所有小于deliveryTag的消息。

    消费者成功处理后,调用channel.basicAck(message.getMessageProperties().getDeliveryTag(), false)方法对消息进行确认。

    (2.2)失败确认

    void basicNack(long deliveryTag, boolean multiple, boolean requeue)
    
    throws IOException;
    
    deliveryTag:该消息的index。
    
    multiple:是否批量. true:将一次性拒绝所有小于deliveryTag的消息。
    
    requeue:被拒绝的是否重新入队列。
    
    void basicReject(long deliveryTag, boolean requeue) throws IOException;
    
    deliveryTag:该消息的index。
    
    requeue:被拒绝的是否重新入队列。

    channel.basicNack 与 channel.basicReject 的区别在于basicNack可以批量拒绝多条消息,而basicReject一次只能拒绝一条消息。

     思考:

    (1)手动确认模式,消息手动拒绝中如果requeue为true会重新放入队列,但是如果消费者在处理过程中一直抛出异常,会导致入队-》拒绝-》入队的循环,该怎么处理呢?

    第一种方法是根据异常类型来选择是否重新放入队列。

    第二种方法是先成功确认,然后通过channel.basicPublish()重新发布这个消息。重新发布的消息网上说会放到队列后面,进而不会影响已经进入队列的消息处理。

    void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body)
    
    throws IOException;

    (2)消息确认的作用是什么?

    为了防止消息丢失。消息丢失分为发送丢失和消费者处理丢失,相应的也有两种确认机制。

  • 相关阅读:
    Android 生命周期
    struts标签,<s:textfield>嵌套<s:property>的问题
    设置input 内容居中显示 .
    Jquery实现遮罩层,就是弹出DIV周围都灰色不能操作
    如何用Jquery实现 ,比如点击图片之后 ,该图片变成向下的箭头,再点击向下箭头的图片 又变成原始图片呢
    html制作,点击文字超链接显示文本框,再点击文字超链接隐藏文本框
    hibernate mysql视图操作
    Java 日期时间 Date类型,long类型,String类型表现形式的转换
    Spring启动异常: cvc-elt.1: Cannot find the declaration of element 'beans'(转)
    解决不联网无法启动struts2问题
  • 原文地址:https://www.cnblogs.com/Javame/p/12131550.html
Copyright © 2011-2022 走看看