RabbitMQ:消息发送确认 与 消息接收确认(ACK)

本文详细介绍了RabbitMQ中消息的发送确认和消费确认机制,包括ConfirmCallback和ReturnCallback的使用,以及自动确认和手动确认的区别。在消息消费确认部分,讨论了ACK的重要性,如何局部和全局处理消息确认,并提到了消息的持久化和可靠性策略,以防止消息丢失。
摘要由CSDN通过智能技术生成

概述

默认情况下如果一个 Message 被消费者所正确接收则会被从 Queue 中移除

如果一个 Queue 没被任何消费者订阅,那么这个 Queue 中的消息会被 Cache(缓存),当有消费者订阅时则会立即发送,当 Message 被消费者正确接收时,就会被从 Queue 中移除

一.消息投递确认

1.1. 发送的消息怎么样才算失败或成功?如何确认?

当消息无法路由到队列时,确认消息路由失败。消息成功路由时,当需要发送的队列都发送成功后,进行确认消息,对于持久化队列意味着写入磁盘,对于镜像队列意味着所有镜像接收成功

1.2.ConfirmCallback

通过实现 ConfirmCallback 接口,消息发送到 Broker 后触发回调,确认消息是否到达 Broker 服务器,也就是只确认是否正确到达 Exchange 中

@Component
public class RabbitTemplateConfig implements RabbitTemplate.ConfirmCallback{
   

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostConstruct
    public void init(){
   
        rabbitTemplate.setConfirmCallback(this);            //指定 ConfirmCallback
    }

    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
   
        System.out.println("消息唯一标识:"+correlationData);
        System.out.println("确认结果:"+ack);
        System.out.println("失败原因:"+cause);
    }

还需要在配置文件添加配置

spring:
  rabbitmq:
    publisher-returns: true 

1.3.ReturnCallback

通过实现 ReturnCallback 接口,启动消息失败返回,比如路由不到队列时触发回调

@Component
public class RabbitTemplateConfig implements RabbitTemplate.ReturnCallback{
   

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostConstruct
    public void init(){
   
        rabbitTemplate.setReturnCallback(this);             //指定 ReturnCallback
    }

    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
   
        System.out.println("消息主体 message : "+message);
        System.out.println("消息主体 message : "+replyCode);
        System.out.println("描述:"+replyText
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ 中,消费者接收消息后,需要发送 ACK 确认接收,以告知 RabbitMQ消息已经被正确接收并处理。如果消费者接收消息后没有发送 ACK 确认接收,那么 RabbitMQ认为该消息没有被正确地处理,重新将消息发送给其他消费者。 在 RabbitMQ 中,发送 ACK 确认接收的方式有两种: 1. 自动确认模式 在自动确认模式下,当消费者接收消息后,RabbitMQ 自动发送 ACK 确认接收,不需要手动发送 ACK。这种模式下,如果消息处理失败,那么消息被丢弃,因此,只有在消息处理相对简单、不需要进行复杂的错误处理时,才适合使用自动确认模式。 2. 手动确认模式 在手动确认模式下,当消费者接收消息后,需要手动发送 ACK 确认接收。如果消息处理失败,可以发送 NACK 拒绝接收,然后重新将消息发送给其他消费者。手动确认模式可以保证消息的可靠性和一致性,但需要消费者手动发送 ACK、NACK 等命令,因此比较复杂。 在 RabbitMQ 的 Java 客户端中,可以使用 channel.basicAck() 方法手动发送 ACK 确认接收,使用 channel.basicNack() 方法发送 NACK 拒绝接收。例如,以下代码演示了如何手动发送 ACK 确认接收: ```java channel.basicConsume(queueName, false, new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { // 处理消息 // ... // 手动发送 ACK 确认接收 channel.basicAck(envelope.getDeliveryTag(), false); } }); ``` 在上述代码中,第二个参数设置为 false,表示关闭自动确认模式,需要手动发送 ACK 确认接收。当消息处理完成后,调用 channel.basicAck() 方法发送 ACK 确认接收。这样可以保证消息正确地处理,并且可以避免消息丢失的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值