前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【RabbitMQ】消息确认机制ACK

【RabbitMQ】消息确认机制ACK

原创
作者头像
后端码匠
发布2023-11-12 21:39:31
2840
发布2023-11-12 21:39:31
举报
文章被收录于专栏:后端码匠

【RabbitMQ】消息确认机制ACK

消费者从RabbitMQ收到消息并处理完成后,反馈给RabbitMQ,RabbitMQ收到反馈后才将此消息从队列中删除

  • 消费者在处理消息出现了网络不稳定、服务器异常等现象,那么就不会有ACK反馈,RabbitMQ会认为这个消息没有正常消费,会将消息重新放入队列中
  • 只有当消费者正确发送ACK反馈,RabbitMQ确认收到后,消息才会从RabbitMQ服务器的数据中删除。
  • 消息的ACK确认机制默认是打开的,消息如未被进行ACK的消息确认机制,这条消息被锁定Unacked

我们也可以将其改成手工确认模式:

代码语言:yaml
复制
spring:
  rabbitmq:
    # 开启手动确认消息,如果消息重新入队,进行重试
    listener:
      simple:
        acknowledge-mode: manual

重写之前的Handler:

代码语言:java
复制
package cn.com.codingce.listener;

import cn.com.codingce.config.RabbitMQConfig;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Slf4j
@Component
@RabbitListener(queues = RabbitMQConfig.QUEUE) // 监听的队列名称
public class HealthHra3MQListener {

    @RabbitHandler
    public void releaseCouponRecordAcknowledge(String body, Message message, Channel channel) throws IOException {
        log.info("releaseCouponRecordAcknowledge three into");
        long msgTag = message.getMessageProperties().getDeliveryTag();
        System.out.println("msgTag=" + msgTag);
        System.out.println("message=" + message.toString());
        System.out.println("body=" + body);

        // 成功确认,使用此回执方法后,消息会被 rabbitmq broker 删除
        // channel.basicAck(msgTag,false); // 正常返回ACK确认信息
        // channel.basicNack(msgTag,false,true); // 告诉broker,消息拒绝确认,最后一个true代表返回队列,为False代表丢弃
    }

}

LOG

代码语言:shell
复制
2023-11-12 21:38:31.780  INFO 13924 --- [nio-9090-exec-4] c.c.codingce.controller.SendController   : 生产者到交换机通过confirmCallback 可靠性投递 confirmCallback
2023-11-12 21:38:31.787  INFO 13924 --- [ntContainer#0-1] c.c.c.listener.HealthHra3MQListener      : releaseCouponRecordAcknowledge three into
msgTag=6
message=(Body:'新HRA3报告来了!!' MessageProperties [headers={}, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=health_hra3_exchange, receivedRoutingKey=health.new, deliveryTag=6, consumerTag=amq.ctag-_KcmDv_gfhWjG1KAowHXSw, consumerQueue=health_hra3_queue])
body=新HRA3报告来了!!
2023-11-12 21:38:31.789  INFO 13924 --- [nectionFactory1] c.c.codingce.controller.SendController   : confirm==== ack=true
2023-11-12 21:38:31.789  INFO 13924 --- [nectionFactory1] c.c.codingce.controller.SendController   : confirm==== cause=null
2023-11-12 21:38:31.789  INFO 13924 --- [nectionFactory1] c.c.codingce.controller.SendController   : 发送成功,null

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【RabbitMQ】消息确认机制ACK
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档