动力节点rabbitmq笔记-12-17RabbitMQ消息Confirm模式

本文深入探讨了RabbitMQ的Confirm和Return模式,以确保消息的可靠投递。Confirm模式保证消息到达交换机,Return模式处理消息路由失败。文中还介绍了交换机和队列的详细属性,包括备用交换机的使用,以及如何处理消息的幂等性,以防止重复消费。同时,展示了相关Java代码示例,展示了如何在应用中实现这些机制。
摘要由CSDN通过智能技术生成

12.RabbitMQ消息Confirm模式

12.1 Confirm模式简介

消息的confirm确认机制,是指生产者投递消息后,到达了消息服务器Broker里面的exchange交换机,则会给生产者一个应答,生产者接收到应答,用来确定这条消息是否正常的发送到Broker的exchange中,这也是消息可靠性投递的重要保障;

12.2 具体代码设置

1 配置文件application.yml 开启确认模式:spring.rabbitmq.publisher-confirm-type=_correlated_2 写一个类实现implements RabbitTemplate.ConfirmCallback,判断成功和失败的ack结果,可以根据具体的结果,如果ack为false,对消息进行重新发送或记录日志等处理;设置rabbitTemplate的确认回调方法3 rabbitTemplate.setConfirmCallback(messageConfirmCallBack);

参考代码:

| @Component
public class MessageConfirmCallBack implements RabbitTemplate.ConfirmCallback {
 
    /**
     * 交换机收到消息后,会回调该方法
     *
     * @param correlationData  相关联的数据
     * @param ack  有两个取值,true和false,true表示成功:消息正确地到达交换机,反之false就是消息没有正确地到达交换机
     * @param cause 消息没有正确地到达交换机的原因是什么
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        System.out.println("correlationData = " + correlationData);
        System.out.println("ack = " + ack);
        System.out.println("cause = " + cause);
 
        if (ack) {
            //正常
        } else {
            //不正常的,可能需要记日志或重新发送
        }
    }

}

发消息参考代码

| @Service
public class MessageService {
 
    @Resource
    private RabbitTemplate rabbitTemplate;
 
    @Resource
    private MessageConfirmCallBack messageConfirmCallBack;
 
    @PostConstruct //bean在初始化的时候,会调用一次该方法,只调用一次,起到初始化的作用
    public void init() {
        rabbitTemplate.setConfirmCallback(messageConfirmCallBack);
    }
 
    /**
     * 发送消息
     */
    public void sendMessage() {
        //关联数据对象
        CorrelationData correlationData = new CorrelationData();
        correlationData.setId(“O159899323”); //比如设置一个订单ID,到时候在confirm回调里面,你就可以知道是哪个订单没有发送到交换机上去
        rabbitTemplate.convertAndSend(RabbitConfig.EXCHANGE + 123, “info”, “hello”, correlationData);
        System.out.println(“消息发送完毕…”);
    }
}
  |
| — |

两个示例:可以在发消息时直接实现接口

13. RabbitMQ消息Return模式

rabbitmq 整个消息投递的路径为:
producer —> exchange —> queue —> consumer

消息从 producer 到 exchange 则会返回一个 confirmCallback;
 消息从 exchange –> queue 投递失败则会返回一个 returnCallback;
 
我们可以利用这两个callback控制消息的可靠性投递;
开启 确认模式;
使用rabbitTemplate.setConfirmCallback设置回调函数,当消息发送到exchange后回调confirm方法。在方法中判断ack,如果为true,则发送成功,如果为false,则发送失败,需要处理;
 
注意配置文件中,开启 退回模式;

spring.rabbitmq.publisher-returns: true

使用rabbitTemplate.setReturnCallback设置退回函数,当消息从exchange路由到
queue失败后,则会将消息退回给producer,并执行回调函数returnedMessage;

|  
@Component
public class MessageReturnCallBack implements RabbitTemplate.ReturnsCallback {
 
    /**
     * 当消息从交换机 没有正确地 到达队列,则会触发该方法
     * 如果消息从交换机 正确地 到达队列了,那么就不会触发该方法
     *
     * @param returned
     */
    @Override
    public void returnedMessage(ReturnedMessage returned) {
        System.out.println(“消息return模式:” + returned);
    }

}

参考发送代码

| @Service
public class MessageService {
 
    @Resource
    private RabbitTemplate rabbitTemplate;
 
    @Resource
    private MessageReturnCallBack messageReturnCallBack;
 
    @PostConstruct //bean在初始化的时候,会调用一次该方法,只调用一次,起到初始化的作用
    public void init() {
        rabbitTemplate.setReturnsCallback(messageReturnCallBack);
    }
 
    /**
     * 发送消息
     */
    public void sendMessage() {
        rabbitTemplate.convertAndSend(RabbitConfig.EXCHANGE, “info123”, “hello”);
        System.out.println(“消息发送完毕…”);
    }
}
  |
| — |

代码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值