Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【RabbitMQ】消息确认机制ACK

【RabbitMQ】消息确认机制ACK

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

【RabbitMQ】消息确认机制ACK

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

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

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

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

重写之前的Handler:

代码语言:java
AI代码解释
复制
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
AI代码解释
复制
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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【RabbitMQ】消息可靠性投递
什么是消息的可靠性投递?即保证消息百分百发送到消息队列中去,消息发送端需要接受到mq服务端接受到消息的确认应答。除此之外还应有完善的消息补偿机制,发送失败的消息可以再感知并二次处理。 生产者到交换机通过confirmCallback,交换机到队列通过returnCallback
后端码匠
2023/11/12
3570
【Spring Boot】集成RabbitMQ
Spring-AMQP是Spring框架的AMQP消息解决方案,提供模板化的发送和接收消息的抽象层,提供基于消息驱动的POJO的消息监听等。
后端码匠
2023/11/12
3590
RabbitMQ的消息确认ACK机制
  答:如果在处理消息的过程中,消费者的服务器在处理消息的时候出现异常,那么可能这条正在处理的消息就没有完成消息消费,数据就会丢失。为了确保数据不会丢失,RabbitMQ支持消息确定-ACK。
别先生
2019/11/04
4.6K0
SpringBoot整合RabbitMQ消息队列-学习笔记 原
本篇文章主要用于记录个人学习RabbitMQ的过程,记录下来方便日后查看,如有错误的地方,还望指正。
拓荒者
2019/09/09
9420
SpringBoot整合RabbitMQ消息队列-学习笔记
                                                                                                    原
消息中间件之Rabbitmq
1、https://www.kancloud.cn/yunxifd/rabbitmq/96997
爱撒谎的男孩
2019/12/31
9690
SpringBoot+RabbitMQ 实现手动消息确认(ACK)
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/09/07
2.9K0
SpringBoot+RabbitMQ 实现手动消息确认(ACK)
SpringBoot与RabbitMQ详解与整合
Direct Exchange是RabbitMQ默认的交换机模式,也是最简单的模式,根据key全文匹配去寻找队列。
码哥字节
2021/07/27
8010
SpringBoot 整合 RabbitMQ(包含三种消息确认机制以及消费端限流)
本文 SpringBoot 与 RabbitMQ 进行整合的时候,包含了三种消息的确认模式,如果查询详细的确认模式设置,请阅读:RabbitMQ的三种消息确认模式 同时消费端也采取了限流的措施,如果对限流细节有兴趣请参照之前的文章阅读:消费端限流
海向
2019/09/23
2.8K0
SpringBoot 整合 RabbitMQ(包含三种消息确认机制以及消费端限流)
RabbitMQ特殊应用
按照现有rabbitMQ的相关知识,⽣产者会发送消息到达消息服务器。但是在实际⽣产环境下,消息⽣产者发送的消息很有可能当到达了消息服务器之后,由于消息服务器的问题导致消息丢失,如宕机。因为消息服务器默认会将消息存储在内存中。⼀旦消息服务器宕机,则消息会产⽣丢失。因此要保证⽣产者的消息不丢失,要开始持久化策略。
ha_lydms
2023/08/10
1640
rabbitmq系统学习(二)
Rabbitmq高级整合应用 RabbitMq整合Spring AMQP实战 RabbitAdmin 使用RabbitTemplate的execute方法执行对应操作 rabbitAdmin.declareExchange()//声明 rabbitAdmin.declareQueue() rabbitAdmin.declareBinding() rabbitAdmin.declareBinding(BindingBuilder.bind(new Queue("test.topic.queue",false
老梁
2019/09/10
8020
Spring Boot系列——7步集成RabbitMQ
RabbitMQ是一种我们经常使用的消息中间件,通过RabbitMQ可以帮助我们实现异步、削峰的目的。
JackieZheng
2018/11/20
9040
rabbitmq实际使用案例_沉默的螺旋案例
大家好,又见面了,我是你们的朋友全栈君。 一.发布与订阅模式(队列–>交换机) yml配置: server: port: 8088 spring: rabbitmq: host: 127.0.0.1 port: 5672 username: guest password: guest publisher-confirm-type: correlated #消息确认方式,通过 correlated 来确认(将来的消息中才会带 correlation_
全栈程序员站长
2022/11/10
7130
rabbitmq实际使用案例_沉默的螺旋案例
SpringBoot整合RabbitMQ(九)
在前面的系列文章中详细的介绍了RabbitMQ的技术栈知识,本文章主要详细的介绍SpringBoot整合RabbitMQ。
无涯WuYa
2022/04/27
4020
SpringBoot整合RabbitMQ(九)
springboot + rabbitmq 用了消息确认机制,感觉掉坑里了
最近部门号召大伙多组织一些技术分享会,说是要活跃公司的技术氛围,但早就看穿一切的我知道,这 T M 就是为了刷KPI。不过,话说回来这的确是件好事,与其开那些没味的扯皮会,多做技术交流还是很有助于个人成长的。
程序员小富
2020/07/01
7830
springboot + rabbitmq 用了消息确认机制,感觉掉坑里了
springboot下使用rabbitMQ之开发配置方式(一)
本次结合着B站某MQ视频以及最近在MQ上的实践聊一聊个人在使用rabbitMQ中所得。
上帝
2023/10/16
1.2K0
springboot下使用rabbitMQ之开发配置方式(一)
手把手带你Springboot整合RabbitMq ,一篇讲完
该篇文章内容较多,包括有rabbitMq相关的一些简单理论介绍,provider消息推送实例,consumer消息消费实例,Direct、Topic、Fanout的使用,消息回调、手动确认等。(但是关于rabbitMq的安装,就不介绍了)
java进阶架构师
2020/06/16
1.9K0
手把手带你Springboot整合RabbitMq ,一篇讲完
springboot-RabbitMQ发送短信
Kafka不管是消费成功还是失败,都不会立即从mq服务端中移除,使用offset记录消息消费情况
阿超
2022/08/16
9.1K0
springboot-RabbitMQ发送短信
RabbitMQ学习笔记(四)——RabbitMQ与SpringBoot适配
◆ 异步消息监听容器 ◆ 原生提供RabbitTemplate,方便收发消息 ◆ 原生提供RabbitAdmin,方便队列、交换机声明 ◆ Spring Boot Config原生支持RabbitMQ
不愿意做鱼的小鲸鱼
2022/09/26
1.7K0
RabbitMQ学习笔记(四)——RabbitMQ与SpringBoot适配
SpringBoot RabbitMQ
RabbitMQ的流程是:生产者将消息发送到对应交换机上,交换机再将消息转发到绑定的队列上,消费者从绑定的队列获取消息进行消费。
用户8682940
2021/12/02
5930
RabbitMQ高级特性之消费端限流
假设我们现在有这么一个场景,我们的消费端由于某些原因导致全部宕机等不可用,导致RabbitMQ服务器队列中存储了大量消息未被消费掉,那么等恢复消费端服务器后,就会有巨大量的消息全部推送过来,但是我们单个客户端无法同事处理这么多消息,就是导致消费端一些不可预测错误,甚至又会重复发生宕机,所以在实际业务场景中,限流保护还是非常重要的。
黎明大大
2021/03/08
7890
相关推荐
【RabbitMQ】消息可靠性投递
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档