zoukankan      html  css  js  c++  java
  • rabbitmq生产者的消息确认

    通过Publisher Confirms and Returns机制,生产者可以判断消息是否发送到了exchange及queue,而通过消费者确认机制,Rabbitmq可以决定是否重发消息给消费者,以保证消息被处理。

    1.什么是Publisher Confirms and Returns?

    Delivery processing acknowledgements from consumers to RabbitMQ are known as acknowledgements in AMQP 0-9-1 parlance; broker acknowledgements to publishers are a protocol extension called publisher confirms. 
    地址:http://www.rabbitmq.com/confirms.html

    根据RabbitMq官网定义,rabbitmq代理(broker)对发布者(publishers)的确认被称作发布者确认(publisher confirms),这种机制是Rabbitmq对标准Amqp协议的扩展。因此通过这种机制可以确认消息是否发送给了目标。

    2.如何通过Spring amqp来使用Publisher Confirms and Returns机制?

    Confirmed and returned messages are supported by setting the CachingConnectionFactory’s publisherConfirms and publisherReturns properties to ‘true’ respectively.When these options are set, Channel s created by the factory are wrapped in an PublisherCallbackChannel, which is used to facilitate the callbacks. When such a channel is obtained, the client can register a PublisherCallbackChannel.Listener with the Channel. The PublisherCallbackChannel implementation contains logic to route a confirm/return to the appropriate listener. These features are explained further in the following sections. 
    http://docs.spring.io/spring-amqp/docs/1.6.3.RELEASE/reference/html/_reference.html#cf-pub-conf-ret

    通过Spring amqp文档可以看到,要使用这种机制需要将Template模版的设publisherConfirms 或publisherReturns 属性设置为true,此外ConnectionFactory要配置为CachingConnectionFactory。

    复制代码
        <bean id="connectionFactory"
            class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
            <property name="host" value="192.168.2.133" />
            <property name="port" value="5672" />
            <property name="username" value="sun" />
            <property name="password" value="123456" />
            <property name="publisherConfirms" value="true" />
            <property name="publisherReturns" value="true" />
        </bean>
    复制代码

    2.1 ConfirmCallback的使用及触发的一种场景

    复制代码
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.amqp.rabbit.core.RabbitTemplate;
    import org.springframework.amqp.rabbit.support.CorrelationData;
    import org.springframework.stereotype.Service;
    
    /**
     * @author wangzhongqiu
     *         Created on 2017/10/31.
     * @description:继承RabbitTemplate.ConfirmCallback,消息确认监听器
     */
    @Service
    public class ConfirmCallBackListener implements RabbitTemplate.ConfirmCallback {
        private Logger log = LoggerFactory.getLogger(CommonProducer.class);
    
        @Override
        public void confirm(CorrelationData correlationData, boolean ack, String cause) {
            log.info("收到回调,成功发送到broker");
        }
    }
    复制代码

    2.2 ReturnCallback的使用及触发的一种场景

    复制代码
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.amqp.core.Message;
    import org.springframework.amqp.rabbit.core.RabbitTemplate;
    import org.springframework.stereotype.Service;
    
    /**
     * @author wangzhongqiu
     *         Created on 2017/10/31.
     * @description:继承RabbitTemplate.ReturnCallback,消息发送失败返回监听器
     */
    @Service
    public class ReturnCallBackListener implements RabbitTemplate.ReturnCallback {
        private Logger log = LoggerFactory.getLogger(CommonProducer.class);
    
        @Override
        public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
            log.info("收到回调");
            log.info("return--message:" + new String(message.getBody()) + ",replyCode:" + replyCode + ",replyText:" + replyText + ",exchange:" + exchange + ",routingKey:" + routingKey);
        }
    }
    复制代码

    使用场景:

    如果消息没有到exchange,则confirm回调,ack=false

    如果消息到达exchange,则confirm回调,ack=true

    exchange到queue成功,则不回调return

    exchange到queue失败,则回调return(需设置mandatory=true,否则不回回调,消息就丢了)

    转载::http://www.cnblogs.com/wangzhongqiu/

  • 相关阅读:
    c++ 输出 变量名 字符串(zz.is2120.BG57IV3)
    分页存储过程
    连接字符串
    动软 DBHeper 完全代码
    java 数据库连接字符串
    DOS命令行下常见的错误信息
    点击单元格选择整行,又可编辑单元格
    label里文字中的下划线
    Delphi程序中动态生成控件的方法及应用
    双击dbgrid排序的问题
  • 原文地址:https://www.cnblogs.com/leeego-123/p/11238428.html
Copyright © 2011-2022 走看看