RabbitMq-消息确认机制-消息队列可靠投递

RabbitMq-消息确认机制-消息队列可靠投递

发送端确认
ConfirmCallback

在spring中开启ConfirmCallback,

springboot rabbitmq属性配置spring.rabbitmq.publisher-confirm和spring.rabbitmq.publisher-confirm-type详解_弃用的配置属性 'spring.rabbitmq.publisher-confirms-CSDN博客

properties 复制代码
# 这个属性在新版RabbitMq中已经被弃用
# spring.rabbitmq.publisher-confirms = true 
spring.rabbitmq.publisher-confirm-type = correlated #新版本使用这个属性
java 复制代码
@Configuration
public class MyRabbitConfig {
    @Autowired
    RabbitTemplate rabbitTemplate;
    
    @PostConstruct //MyRabbitConfig对象创建完成以后,执行这个方法
    public void initRabbitTemplate() {
        // 设置确认回调
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {

            @Override
            public void confirm(CorrelationData correlationData, boolean b, String s) {
                System.out.println("...");
            }
        });
    }
}

correlationData是消息的唯一id,在发送消息的时候可以显性设置这个id。如下:

java 复制代码
rabbitTemplate.convertAndSend("hello-java-exchange", "hello.java",reasonEntity,new CorrelationData(UUID.randomUUID().toString()));

如果在配置配置类的过程中出现依赖循环,可以试试在application.properties中加上:

properties 复制代码
spring.main.allow-circular-references=true
returnCallback

配置文件中添加:

properties 复制代码
#开启发送端 抵达 队列的确认
spring.rabbitmq.publisher-returns=true

spring.rabbitmq.template.mandatory=true

在配置文件中添加:

java 复制代码
rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {
            @Override
            public void returnedMessage(ReturnedMessage returnedMessage) {
                System.out.println(returnedMessage.toString());
            }
        });

在更新的spring版本中,使用ReturnsCallback接口进行回调。

完整的配置文件如下:ConfirmCallback和returnCallback,

java 复制代码
@Configuration
public class MyRabbitConfig {
    @Autowired
    RabbitTemplate rabbitTemplate;

    @PostConstruct //确保rabbitTemplate注入完成后,执行这个方法,否则可能会返回空指针异常
    public void initRabbitTemplate() {
        // 设置确认回调
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {

            @Override
            public void confirm(CorrelationData correlationData, boolean b, String s) {
                System.out.println("回调成功" + b);
            }
        });

        rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {
            @Override
            public void returnedMessage(ReturnedMessage returnedMessage) {
                System.out.println(returnedMessage.toString());
            }
        });
    }
}
ack

配置文件中添加:

properties 复制代码
spring.rabbitmq.listener.simple.acknowledge-mode=manual

默认确认模式为Auto(自动确认),其余取值有Manual(手动确认)和None(不确认)。

自动确认模式下,当方法获取到消息就立即向mq服务器返回确认,而不是等待直到方法完成。

配置手动确认:

java 复制代码
long deliveryTag=message.getMessageProperties().getDeliveryTag();
try{
	// false表示仅确认当前的消息
	channel.basicAck(deliveryTag,false);
}catch(Exception e){
	//网路中断
}

deliveryTag是 RabbitMQ 为每条消息生成的唯一标识符,用于消息的确认和重试机制。它是一个单调递增的 64 位长整型值,每个通道(Channel)独立维护,因此在每个通道上是唯一的。

举例:一条通道内的第一条消息,它的deliveryTag是1,第二条则是2,第三条是3,如此递增...

不确认和拒签

java 复制代码
try{
	//不确认
	// 第一个false的参数名为multiple,表示仅是否批量处理;第二个false的参数名为requeue,表示仅是否重新入队
    //long deliveryTag, boolean mutiple, boolean requeue
	channel.basicNack(deliveryTag,false,false);
	
	//拒签
	//long deliveryTag, boolean requeue
	channel.basicReject(deliveryTag,false);
}catch(Exception e){
	//网路中断
}
相关推荐
此时不提桶,更待何时16 小时前
06-12-A-Kafka存储深水区与源码解析详解
分布式·kafka·linq
此时不提桶,更待何时20 小时前
06-15-A-Kafka生态集成与流处理详解
分布式·kafka
此时不提桶,更待何时1 天前
06-13-A-Kafka客户端与协议深入详解
分布式·kafka
程序猿乐锅1 天前
从0-1一文详解RabbitMQ
java·分布式·后端·中间件·rabbitmq·ruby
新鲜势力呀2 天前
PHP 消息队列实战:从同步接口阻塞到 RabbitMQ + Redis队列 + 异步任务架构完整优化方案
redis·rabbitmq·php
老陈说编程2 天前
1. 鸿蒙 (HarmonyOS) 2012 至 2026 年的发展历程
分布式·华为·个人开发·harmonyos·鸿蒙·鸿蒙系统·程序员创富
xxwl5853 天前
RabbitMQ 学习笔记
笔记·学习·rabbitmq
ly76894 天前
Redis 分布式锁的边界条件:Redlock 争议、锁续期与客户端崩溃后的互斥失效
数据库·redis·分布式·分布式锁·watchdog·redlock
灯澜忆梦4 天前
【minio】#5 | MinIO 分布式部署 + HTTPS 部署
分布式·网络协议·https·对象存储·minio