rabbitMq确认机制之ConfirmType

配置方式

java 复制代码
 @Bean(name = "connectionFactory")
    @Primary
    public ConnectionFactory normalConnectionFactory(
   
            @Value("${spring.rabbitmq.username}") String username,
            @Value("${spring.rabbitmq.password}") String password,
            @Value("${spring.rabbitmq.addresses}") String address) {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
 
        connectionFactory.setAddresses(address);
        connectionFactory.setUsername(username);
        connectionFactory.setPassword(password);
     //   connectionFactory.setPublisherConfirms(true);
        connectionFactory.setPublisherReturns(true);
        connectionFactory.setPublisherConfirmType(CachingConnectionFactory.ConfirmType.CORRELATED);
        connectionFactory.setExecutor(createThreadPool(10,
                20,
                "mq-connection-",
                "mq-connection-group"));
        return connectionFactory;
    }

或者配置文件里配置

java 复制代码
spring:
  # RabbitMQ 配置项,对应 RabbitProperties 配置类
  rabbitmq:
    publisher-confirm-type: correlated

publisher-confirm-type属性有三个可选值:

  1. none(默认):关闭发布确认模式。
  2. correlated:消息从生产者发送到交换机后触发回调方法。
  3. simple:会触发回调方法,相当于单个确认(发一条确认一条)。在发布消息成功后使用rabbitTemplate调用waitForConfirms或waitForConfirmsOrDie方法等待broker节点返回发送结果,根据返回结果来判定下一步的逻辑,要注意的点是 waitForConfirmsOrDie方法如果返回false则会关闭channel,则接下来无法发送消息到broker。

使用方式

SIMPLE模式

开启simple模式需要在invoke方法中一起执行 rabbitTemplate.waitForConfirms

同时也会收到回调,回调后结束阻塞,同时可以获取到返回结果。

java 复制代码
  RabbitTemplate.ConfirmCallback confirmCallback = new RabbitTemplate.ConfirmCallback() {
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                if (ack){
                    System.out.println(correlationData.toString() + "发送成功");
                }else {
                    System.out.println(correlationData.toString() + "发送失败, 原因: " + cause);
                }
            }
        };
        rabbitTemplate.setConfirmCallback(confirmCallback);
        Boolean invoke = rabbitTemplate.invoke(operations -> {
            rabbitTemplate.convertAndSend("direct_exchange", "ROUTING_KEY_01", message, correlationData);
            return rabbitTemplate.waitForConfirms(1000l);
        });

CORRELATED模式

java 复制代码
     RabbitTemplate.ConfirmCallback confirmCallback = new RabbitTemplate.ConfirmCallback() {
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                if (ack){
                    System.out.println(correlationData.toString() + "发送成功");
                }else {
                    System.out.println(correlationData.toString() + "发送失败, 原因: " + cause);
                }
            }
        };
        rabbitTemplate.setConfirmCallback(confirmCallback);
    
        rabbitTemplate.convertAndSend("direct_exchange", "ROUTING_KEY_01", message, correlationData);
   


    //    correlationData.getFuture().get();
        sleep(1000*60);
        System.out.println("发送消息boot mq hello Direct成功");

实现通过callback实现保证消息发送成功。

可以看出来,在开启publisher-confirm的情况下,如果不自行实现ConfirmCallback的逻辑,也无法做到保证消息成功发送。

可以在发送消息时更新为发送中。

收到callback更新为发送成功,或者发送失败。

对于发送失败的安排重试,可以在消息头加上重试次数记录重试次数,达到指定次数,更新为发送失败。

相关推荐
小二·1 小时前
Redis 7 分布式缓存架构实战
redis·分布式·缓存
zhuhai_xigedian1 小时前
源网荷储一体化 vs 传统供用电模式:差异、优势与转型路径
大数据·人工智能·分布式·系统架构·能源
凯源智能3 小时前
屋顶分布式光伏箱变远程测控实战:宝鸡法士特项目高效交付解析
分布式
Amy187021118234 小时前
东南亚智慧物流园区的“隐形守护者”:有源滤波柜如何驯服变频器5/7次谐波
分布式·能源
闪电悠米5 小时前
黑马点评-Redis 消息队列-04_stream_seckill_order
数据库·redis·分布式·缓存·oracle·junit·lua
HLAIA光子5 小时前
分布式锁与事务:你的微服务可能根本不需要它们
分布式·后端·微服务
bmjIjFNC85 小时前
Redis分布式锁进第九十一篇
数据库·redis·分布式
段一凡-华北理工大学5 小时前
工业领域的Hadoop架构学习~系列文章24:adoop工业应用总结与展望 - 技术路线图与最佳实践
大数据·人工智能·hadoop·分布式·学习·架构·高炉炼铁
我是一颗柠檬6 小时前
【Java项目技术亮点】读写分离+主从延迟处理:MySQL高并发下的性能优化方案
java·分布式·mysql·性能优化
爱吃苹果的梨叔6 小时前
2026年分布式坐席系统哪家好:指挥中心与调度大厅选型参考
分布式·python