RabbitMQ确保成功发送数据的Confirm模式与Return模式

一.Confirm模式

确保消息能够从生产者发送到交换机 ,无论消息发送是否成功都执行一个回调方法

开发步骤

1.设置配置文件中ConnectionFactory的publisher-confirm属性为true,以开启Confirm模式

 <rabbit:connection-factory id="connectionFactory"
                               host="${rabbitmq.host}"
                               port="${rabbitmq.port}"
                               virtual-host="${rabbitmq.virtual-host}"
                               username="${rabbitmq.username}"
                               password="${rabbitmq.password}"
                               publisher-confirms="true"
                              
    />

2.利用RabbitTemplate对象设置回调函数ConfirmCallback,并覆盖重新该函数的confirm方法

 //定义confirm模式下的回调函数confirmCallback
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            /**
             *
             * @param correlationData 相关配置信息对象
             * @param ack  交换机是否接收到数据的标识  true 收到 false没收到
             * @param cause 没收到消息的原因 若收到则为null
             */
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                //对消息是否成功发送到交换机进行判断
                if(ack){
                    //消息成功发送
                    System.out.println("消息发送成功"+cause);
                }else {
                    System.out.println("消息发送失败 原因是:"+cause);
                }
            }
        });
         rabbitTemplate.convertAndSend("directExchange_confirm","direct_queue1","gogogo");

若交换机成功收到消息,那么boolean ack 就为true 错误信息cause为null,反之为false cause中会包含错误信息
RabbitMQ确保成功发送数据的Confirm模式与Return模式_第1张图片
RabbitMQ确保成功发送数据的Confirm模式与Return模式_第2张图片
交换机名称错误,该交换机不存在,导致消息从生产者到交换机失败

注意 confirm模式只确保将数据发送至交换机,若交换机转发至队列失败时不会执行该回调函数中的方法

RabbitMQ确保成功发送数据的Confirm模式与Return模式_第3张图片

二.Return模式

确保消息从交换机发送到队列,在发送失败的情况下Exchange有两种处理失败消息的模式,一种直接丢弃失败消息(默认是此种模式处理)一种将失败消息发送给ReturnCallBack

开发步骤

1.设置配置文件中ConnectionFactory的publisher-returns属性为true,以开启Return模式
2.RabbitTmplate对象设置ReturnCallBack回调函数,并覆盖重写returnedMessage方法

 //利用RabbitTemplate对象创建ReturnCallback函数
        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            /**
             * 此方法只有在设置工作模式为Return,并且设置exchange对失败消息的处理为发送给ReturnCallBack,当发送消息失败时会执行该方法
             * @param message 发送失败,交由exchange发回的数据
             * @param replyCode 错误码
             * @param replyText 错误信息
             * @param exchange  交换机名
             * @param routingKey 路由规则
             */
            @Override
            public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
                System.out.println(message);
                System.out.println(replyCode);
                System.out.println(replyText);
                System.out.println(exchange);
                System.out.println(routingKey);
            }
        });

只有当数据从exchange发送至队列失败,并且设置exchange处理失败消息的模式为发回数据时,才会执行该returnedMessage

3.设置exchang处理失败消息的模式

 //设置exchange对失败消息的处理方式
        /**
         * 默认为false直接丢弃失败数据
         * true将失败消息发送给回调函数
         */
        rabbitTemplate.setMandatory(true);

false 为默认模式直接丢弃失败消息,并且returnedMessage不会执行
RabbitMQ确保成功发送数据的Confirm模式与Return模式_第4张图片

true 将失败消息发回给ReturnCallBack 并且returnedMessage会执行
RabbitMQ确保成功发送数据的Confirm模式与Return模式_第5张图片

注意Return模式只关注消息是否从exchange发送至队列成功与否,若消息发送至exchange失败,returnedMessage是不会执行的

你可能感兴趣的:(rabbitmq)