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接口进行回调。

完整的配置文件如下:ConfirmCallbackreturnCallback

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){
	//网路中断
}
相关推荐
ffqws_17 分钟前
Redis 分布式锁:基于 Redisson 的实现与面试高频问答
redis·分布式·面试
六bring个六6 小时前
open Harmony中分布式软总线的学习任务清单
分布式·学习·c/c++·open harmony
wuqingshun3141596 小时前
说一下 Kafka 中关于事务消息的实现?
分布式·kafka
名字还没想好☜11 小时前
用 Redis + Redisson 实现分布式锁:从踩坑到生产可用
java·redis·分布式·junit·分布式锁·redisson
qiu_lovejun99811 小时前
linux安装docker和redis和rabbitmq和nginx和rocketmq和kafka
linux·redis·docker·kafka·rabbitmq·rocketmq
董可伦12 小时前
Spark 源码 | SparkSubmitArguments 参数解析(三)
大数据·分布式·spark
运维行者_13 小时前
广域网性能监控:分布式IT架构下的链路质量保障
开发语言·网络·分布式·后端·架构·数据库架构
她说可以呀13 小时前
RabbitMQ Confirm与Returns模式
分布式·rabbitmq
Mr__Miss14 小时前
Session、Cookie、JWT 详解:从单体到分布式的认证方案演进
分布式
Database_Cool_14 小时前
阿里云 PolarDB-X vs OceanBase 国产分布式数据库深度对比
分布式·阿里云·oceanbase