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

本文详细介绍了RabbitMQ的消息Confirm和Return模式,包括Confirm模式的介绍和代码设置,以及Return模式的原理和回调函数使用。此外,还讨论了交换机和队列的详细属性,如持久化、自动删除和备用交换机的使用。同时,文章涵盖了消息的可靠性投递和幂等性设计,提供了解决消息重复消费问题的方案。
摘要由CSDN通过智能技术生成

12.RabbitMQ消息Confirm模式

12.1 Confirm模式简介

动力节点最新rabbitMQ视频
消息的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("消息发送完毕......");
}

}
|
| — |

代码二,发送消息时直接实现RabbitTemplate.ReturnsCallback

| @Servi

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值