当前位置: 首页 > article >正文

SpringBoot 消息队列RabbitMQ 消息确认机制确保消息发送成功和失败 生产者确认

介绍

有Publisher Confirm(成功)和Publisher Return(失败)两种确认机制。开启确机制认后,在MQ成功收到消息后会返回消息给生产者。

  • 消息投递到了MQ ,但是路由失败。此时会通过PublisherReturn返回路由异常原因,然后返回ACK,告知投递成功。
  • 临时消息投递到了MQ,并且入队成功,返回ACK,告知投递成功。
  • 持久消息投递到了MQ,并且入队完成持久化,返回ACK,告知投递成功
  • 其它情况都会返回NACK,告知投递失败

也就是只要返回的是ACK就可以确定是消息发送成功了。

配置生产者确认

spring:
  rabbitmq:
    host: 128.92.13.281
    port: 5673 #通信端口
    virtual-host: /csdn #虚拟主机名称
    username: c123
    password: 123456aa
    publisher-confirm-type: correlated 
     #开启Publisher Confirm  并设置Confirm类型
    publisher-returns: true #开启Publisher return机制
  • publisher-confirm-type: correlated #MQ异步回调方式返回回执消息
  • publisher-confirm-type: none #关闭Confirm机制
  • publisher-confirm-type: simple #同步阻塞MQ回执消息

RetrunCallback回调(失败)

每个RabbitTemplate只能配置一个ReturnCallback,因此需要在项目启动过程中配。

@Configuration
@Slf4j
public class RabbitMqConfig  implements ApplicationContextAware {
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        RabbitTemplate rabbitTemplate =applicationContext.getBean(RabbitTemplate.class);
        rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {
            @Override
            public void returnedMessage(ReturnedMessage returnedMessage) {
                log.debug("消息发送失败",returnedMessage.getMessage(),
                        returnedMessage.getReplyCode(),//代码
                        returnedMessage.getReplyText(),//消息
                        returnedMessage.getRoutingKey(),//路由Key
                        returnedMessage.getExchange()  //交换机
                        
					//拿到失败消息
                );
            }
        });
    }
}

ConfirmCallback回调(成功)

在每一个消息发送时单独指定

private  final RabbitTemplate rabbitTemplate;
@GetMapping("/putRecord") //插入记录
public Result userMessage(){
    CorrelationData cd=  new CorrelationData(UUID.randomUUID().toString());
    cd.getFuture().addCallback(new ListenableFutureCallback<CorrelationData.Confirm>() {
        @Override
        public void onFailure(Throwable ex) {
            System.out.println("消息回调失败");
        }
        @Override
        public void onSuccess(CorrelationData.Confirm result) {
           System.out.println("收到发送确认回执");
            if (result.isAck())
            {
                System.out.println("消息发送成功");
            }else{
                System.out.println("消息发送失败了"+result.getReason());
            }
        }
    });
    rabbitTemplate.convertAndSend("csdn.fanout","acc","发送的消息",cd);
    return  Result.success("操作成功",null);
}

一般情况下更比较关系NACK消息发送失败。

注意事项

  • 生产者确认需要额外的网络和系统资源开销,尽量不要使用
  • 如果一定要使用,无需开启Publisher-Return机制,因为一般路由失败是自己业务问题
  • 对于nack消息可以有限次数重试,依然失败则记录异常消息

http://www.kler.cn/a/312591.html

相关文章:

  • ABC334
  • MyBatis CRUD快速入门
  • 设计模式:工厂方法模式和策略模式
  • 软件测试面试2024最新热点问题
  • k8s集群安装(kubeadm)
  • zabbix监控端界面时间与服务器时间不对应
  • 普元DWS - Linux下安装DWS标准版
  • AUTOSAR_EXP_ARAComAPI的5章笔记(8)
  • Linux ubuntu debian系统安装UFW防火墙图形化工具GUFW
  • docker- No space left on device
  • 去耦合的一些建议
  • 基于YOLOv5s的无人机航拍输电线瓷瓶检测(附数据集与操作步骤)
  • CVPT: Cross-Attention help Visual Prompt Tuning adapt visual task
  • 云原生-Quarkus
  • 基于Benes网络的SIMD同态密文任意重排
  • HarmonyOS NEXT应用开发案例实践总结合集
  • 【C++笔记】类和对象的深入理解(三)
  • 练习题 - Django 4.x Overviewses 框架概述
  • 1. TypeScript基本语法
  • LangChain 和 Elasticsearch 加速构建 AI 检索代理
  • 练习题 - Django 4.x Models Relationship fields 字段关联关
  • 等保测评中的关键技术挑战与应对策略
  • three.js shader 实现天空中白云
  • 用 Docker 部署 Seafile 社区版
  • C++学习指南(六)----list
  • 【docker】阿里云使用docker,2024各种采坑