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){
	//网路中断
}
相关推荐
1104.北光c°17 分钟前
基于Canal + Kafka的高可用关注系统:一主多从关系链
java·开发语言·笔记·分布式·程序人生·kafka·一主多从
蜜獾云1 小时前
Kafka(1)-Kafka基本术语
分布式·kafka
珠海西格1 小时前
1MW光伏项目“四可”装置数据采集类设备具体配置详解
服务器·网络·人工智能·分布式·安全
jerryinwuhan2 小时前
Spark安装配置2
大数据·分布式·spark
dinl_vin2 小时前
一文通关Spark
大数据·分布式·spark
0xDevNull2 小时前
消息中间件:从起源到选型指南
kafka·rabbitmq
jerryinwuhan3 小时前
Spark RDD 编程入门
大数据·分布式·spark
一叶飘零_sweeeet3 小时前
分布式协调双雄深度拆解:ZooKeeper 与 Nacos 从底层原理到生产实战全指南
分布式·zookeeper·nacos
zxsz_com_cn16 小时前
设备预测性维护方案设计方向,如何设计设备预测性维护方案
分布式
少许极端1 天前
消息队列-RabbitMQ(1)
分布式·消息队列·rabbitmq