当前位置: 首页 > news >正文

rabbitMQ手动应答与自动应答

手动应答模式(manual)

解释:
        手动应答:既是当消费者消费了队列中消息时需要给队列一个应答,告诉队列这条消息我已经消费了,可以删除了;
        若是不应答,即使消费了 队列没收到消费成功的提示 所有消息会一直在队列中;
    注意 注意 注意:重要的事情说三遍,下面说的很重要
 场景:

        当我们使用了手动应答模式,消费者若是成功消费了信息,我们给队列一个成功应答(channel.basicAck(deliveryTag,false);),然后队列收到应答后就会把此消息删除,这点时毋庸置疑的,因为我们已成功消费了这个消息,也不想让此消息继续留在队列中;
        但是,若是消费者消费消息失败了,该怎么办? 这时不能再给队列一个成功的应答(给了那这条消息不就丢失了吗),不给应答呢 消息又一直在队列中,而倘若我们给一个拒绝应答(channel.basicReject(deliveryTag,true) true会重回队列,若是false 消息就丢了,一般都会设置为true;),那么你就成功掉进坑里了,这样队列会一直循环投递消息,而消费者这边又不能成功消费,消费者又拒绝应答,队列又投递消息......
        对,此时就会进入死循环,搞不好光错误日志就会沾满内存;这时该有人会说了,不对,我们在配置文件中不是开启了重试,并且配置了最大重试次数了吗?
        如下配置:
     *                  #是否开启自动重试 默认为false 不开启
     *                  spring.rabbitmq.listener.simple.retry.enabled=true
     *                  #最大重试次数
     *                  spring.rabbitmq.listener.simple.retry.max-attempts=5
     *                  #最大重试时间间隔
     *                  spring.rabbitmq.listener.simple.retry.max-interval=20000ms
     *                  #重试时间间隔
     *                  spring.rabbitmq.listener.simple.retry.initial-interval=2000ms
     *                  # 最大重试间隔*乘数
     *                  #应用于上一重试间隔的乘数 第一次(重试时间间隔)2s 4s 8s 16s 32s 此处32s>20s 以后都以20s为间隔 总的次数为最大重试次数
     *                  spring.rabbitmq.listener.simple.retry.multiplier=2
        那么,应该会在最大重试次数试完还不成功就应该不尝试投递了啊,这样不应该走死循环了啊!
        其实这就是要特别注意的点,当我们开启了手动应答时 当消息没被成功消费并给队列拒绝时上面那些配置其实都已经失效了!!! 所以就会进入死循环!
        但是在开发中我们不想让消息丢失,那么开启自动应答显然不合理,而开启手动应答时当出现错误时(没成功消费)又会进入死循环,那该怎么解决呢?

解决:

        引入死信队列; 当消息没被成功消费时 我们把这条消息投递到私信队列中,然后我们再人为的干预处理此消息即可!

自动应答:

        顾名思义 当消费者成功消费了队列中消息,队列就会自动的把此消息从队列中删除,若是没有消费者或者消费者消费失败,队列在尝试最大重试次数后就会把此消息删除;

 注意:

手动模式 若消息没成功消费时,若给队列拒绝(重试机制不生效),则会进入死循环,若不给拒绝 抛出异常(重试机制生效) 则消息会堆积在队列中,后续投递的消息也会堆积并不会被消费
/*** 消费者*/@Component
@Slf4j
public class DirectConsumer {/*** 手动应答模式(manual)* 解释:*   手动应答:既是当消费者消费了队列中消息时需要给队列一个应答,告诉队列这条消息我已经消费了,可以删除了;*       若是不应答,即使消费了 队列没收到消费成功的提示 所有消息会一直在队列中;*    注意 注意 注意:重要的事情说三遍,下面说的很重要*        场景:当我们使用了手动应答模式,消费者若是成功消费了信息,我们给队列一个成功应答(channel.basicAck(deliveryTag,false);),*            然后队列收到应答后就会把此消息删除,这点时毋庸置疑的,因为我们已成功消费了这个消息,也不想让此消息继续留在队列中;*            但是,若是消费者消费消息失败了,该怎么办? 这时不能再给队列一个成功的应答(给了那这条消息不就丢失了吗),不给应答呢 消息又一直在队列中*            而倘若我们给一个拒绝应答(channel.basicReject(deliveryTag,true) true会重回队列,若是false 消息就丢了,一般都会设置为true;)*            那么你就成功掉进坑里了,这样队列会一直循环投递消息,而消费者这边又不能成功消费,消费者又拒绝应答,队列又投递消息......*            对,此时就会进入死循环,搞不好光错误日志就会沾满内存;这时该有人会说了,不对,我们在配置文件中不是开启了重试,并且配置了最大重试次数了吗?*            如下配置:*                  #是否开启自动重试 默认为false 不开启*                  spring.rabbitmq.listener.simple.retry.enabled=true*                  #最大重试次数*                  spring.rabbitmq.listener.simple.retry.max-attempts=5*                  #最大重试时间间隔*                  spring.rabbitmq.listener.simple.retry.max-interval=20000ms*                  #重试时间间隔*                  spring.rabbitmq.listener.simple.retry.initial-interval=2000ms*                  # 最大重试间隔*乘数*                  #应用于上一重试间隔的乘数 第一次(重试时间间隔)2s 4s 8s 16s 32s 此处32s>20s 以后都以20s为间隔 总的次数为最大重试次数*                  spring.rabbitmq.listener.simple.retry.multiplier=2*             那么,应该会在最大重试次数试完还不成功就应该不尝试投递了啊,这样不应该走死循环了啊!*             其实这就是要特别注意的点,当我们开启了手动应答时 当消息没被成功消费并给队列拒绝时上面那些配置其实都已经失效了!!! 所以就会进入死循环!*             但是在开发中我们不想让消息丢失,那么开启自动应答显然不合理,而开启手动应答时当出现错误时(没成功消费)又会进入死循环,那该怎么解决呢?**             解决: 引入死信队列; 当消息没被成功消费时 我们把这条消息投递到私信队列中,然后我们再人为的干预处理此消息即可!***   自动应答:顾名思义 当消费者成功消费了队列中消息,队列就会自动的把此消息从队列中删除,若是没有消费者或者消费者*        消费失败,队列在尝试最大重试次数后就会把此消息删除;** 注解含义:*   1、@RabbitHandler  handler真正的执行者*   2、@RabbitListener 监听DirectQueue-01这个队列** @param user 接受的消息类型为user(生产者发送的为user类型)* @param message* @param channel* @throws IOException*/@RabbitHandler@RabbitListener(queues = RabbitConfig.QUEUE_KEY_03)public void process2(User user, Message message, Channel channel) throws IOException {
//        long deliveryTag = message.getMessageProperties().getDeliveryTag();try {//业务开始if (user.getId().equals(5)) {int a=1/0;}System.out.println("接受到消息,并正常处理结束"+ JSONUtil.toJsonStr(user));//业务结束/*** 确认应答* basicAck(long deliveryTag, boolean multiple)* deliveryTag:当前消息在队列中的的索引;* multiple:为true的话就是批量确认 是消费一个就应答还是一批处理完再应答;通常都是false 一个一个应答*///           channel.basicAck(deliveryTag,false);}catch (Exception ex){System.out.println(ex.getMessage());System.out.println("接受到消息,发生异常"+ JSONUtil.toJsonStr(user));System.out.println(user);throw ex;//拒绝    true的时候拒绝,false时消息就丢了
//           channel.basicReject(deliveryTag,true);}}
}

相关文章:

rabbitMQ手动应答与自动应答

手动应答模式(manual) 解释: 手动应答:既是当消费者消费了队列中消息时需要给队列一个应答,告诉队列这条消息我已经消费了,可以删除了; 若是不应答,即使消费了 队列没收到消费成功的提示 所有消息会一直在队列中; 注意 注意 注意:重要的事情说三遍,下面说的…...

java对象创建的过程

1、检查指令的参数是否能在常量池中定位到一个类的符号引用 2、检查此符号引用代表的类是否已被加载、解析和初始化过。如果没有,就先执行相应的类加载过程 3、类加载检查通过后,接下来虚拟机将为新生对象分配内存。 4、内存分配完成之后,…...

WireShark流量抓包详解

目录 Wireshark软件安装Wireshark 开始抓包示例Wireshakr抓包界面介绍WireShark 主要界面 wireshark过滤器表达式的规则 Wireshark软件安装 软件下载路径:wireshark官网。按照系统版本选择下载,下载完成后,按照软件提示一路Next安装。 Wire…...

【密码学代码分享】突破ECDSA算法封装--JS无三方包纯手写ECDSA

ECDSA(Elliptic Curve Digital Signature Algorithm)是一种基于椭圆曲线密码学的数字签名算法。它用于确保数字数据的完整性和身份验证,通常在信息安全和加密通信中使用。在日常使用中,通常会使用一些函数库来实现完成这个算法的功…...

stable diffusion实践操作-文生图

本文专门开一节写文生图相关的内容,在看之前,可以同步关注: stable diffusion实践操作 正文 1 liblib SD1.5底模 lora(baihuaniang_1.0) 详细信息: 底模:SD 1.5 Lora:baihuaniang_1.0 正向提示词: Best …...

Spring容器及实例化

一、前言 Spring 容器是 Spring 框架的核心部分,它负责管理和组织应用程序中的对象(Bean)。Spring 容器负责创建、配置和组装这些对象,并且可以在需要时将它们提供给应用程序的其他部分。 Spring 容器提供了两种主要类型的容器&…...

# Go学习-Day9

文章目录 Channel声明存入取出一个简单的死锁分析 个人博客:CSDN博客 Channel Channel本质是一个队列多goroutine访问时不需要加锁,Channel天然线程安全channel有类型,只能写入相同类型channel是引用类型channel必须初始化才能写入数据&…...

chatGPT如何在Java中使用

ChatGPT是一个基于GPT模型的聊天机器人平台,它提供了API接口,可以通过HTTP请求与之交互。您可以使用Java编写程序,通过HTTP请求与ChatGPT进行交互,实现聊天机器人的功能。 具体步骤如下: 1、注册ChatGPT账号并创建应…...

vue+axios——创建多个实例共用请求拦截器和响应拦截器(403错误信息不提示bug解决)——基础积累

创建多个实例共用请求拦截器和响应拦截器:使用的是函数的继承,也就是call()方法,这个方法第一个参数就是this,后面的参数可以是一个也可以是多个。最后一定要记得要return出去,否则接口是拿不到数据的。 import axios from axios…...

全球免费编程教育网站:Code.org

全球免费编程教育网站:Code.org 官网地址注册使用 你还在为小朋友的编程教育而发愁吗? 你还在为小朋友放假无聊而头疼吗? 他来了他来了,全球免费编程教育网站来了。 2013年成立的Code.org是一个非营利组织。 它致力于为年轻女子、…...

构造函数与成员变量初始化

C自学精简教程 目录(必读) 1 为什么需要定义构造函数? 构造函数主要用来给成员变量初始化。 让类对象有一个良好的开始状态。 2 构造函数初始化成员变量 下面我们来完善上一篇文章中的几个构造函数。 让这些构造函数完成给成员变量初始化的职责。 为此&#…...

使用Go env命令设置Go的环境

文章目录 前言Linux的设置Windlows设置Go version > 1.13 当你的GO的版本大于1.13的时候 Set environment variable allow bypassing the proxy for selected modules 前言 在进行Go开发的时候,设置Go的环境变量信息是必须的。下面介绍windows和Linux&#xff0…...

目标检测YOLO实战应用案例100讲-道路场景下目标检测与分割模型的压缩研究与实现(续)

目录 道路场景下目标检测与语义分割模型的改进研究 3.1 道路场景数据集分析 3.1.1 Cityscapes数据集...

b站手机缓存文件转MP4

b站缓存的文件 音频、视频、弹幕是分开的 这里我只用到了音频和视频所以只介绍这一部分 b站的缓存视频文件和路径结构如下 默认缓存路径 内部存储\Android\data\tv.danmaku.bilil\download\89720189 文件夹结构 文件夹 c_738583 这是单个视频的缓存文件夹 进入c_738583文件夹…...

一个集成的BurpSuite漏洞探测插件1.2

4、DNSLog查询漏报 注:扫描结束后才会在BurpSuite的Target、Dashboard模块显示高危漏洞,进程扫描中无法进行同步,但可以在插件中查看(涉及到DoPassive方法问题)。...

[FMMPEG] parse与 demuxer

FFmpeg源码分析:av_parser_parse2()解析数据包 ffmpeg 4.3添加自定义demuxer ffmpeg API基础...

【Bug】Ubuntu 有线设置打不开无反应

前言: 突然有线设置就没法启用了,但是能联网,能查看ip 解决: 最后安装了一个新的依赖包: sudo apt install gnome-control-center 然后就可以了 还有一个方法,没试过,但感觉有点道理的&#…...

迈向无限可能, ATEN宏正领跑设备切换行业革命!

随着互联网在各个领域的广泛应用,线上办公这一不受时间和地点制约、不受发展空间限制的办公模式开始广受追捧,预示着经济的发展正朝着新潮与活跃的方向不断跃进。当然,在互联网时代的背景下,多线程、多设备的线上办公模式也催生了许多问题:多设备间无法进行高速传输、切换;为保…...

Ubuntu18.04:ORB-SLAM3使用数据集构建地图和保存点云地图

文章目录 保存地图方法一:使用ORB-SLAM3自带的保存方法(oea后缀文件)保存地图方法二:使用PCL库保存为PCD类型地图文件安装PCL库:取巧方法:CMakeLists.txt 文件修改内容:(向该文件内添…...

找到自制电子杂志的方法了,快来看看?

终于找到自制电子杂志的方法了,这真是令人兴奋啊!现在,我们可以利用这个方法来创造属于自己的电子杂志,将我们的想法和创意以独特的方式展现给世界。 1.需要一个电子杂志制作工具 市面上有许多专门用于制作电子杂志的工具&#x…...

云端开发新选择:星图OpenClaw镜像+千问3.5-9B联调

云端开发新选择:星图OpenClaw镜像千问3.5-9B联调 1. 为什么选择云端联调方案? 去年尝试在MacBook Pro上本地部署OpenClaw时,风扇狂转的噪音让我意识到一个问题:个人设备跑大模型自动化框架的组合实在太吃资源。当时为了调试一个…...

Uncrustify配置深度解析:从空格对齐到换行控制

Uncrustify配置深度解析:从空格对齐到换行控制 【免费下载链接】uncrustify Code beautifier 项目地址: https://gitcode.com/gh_mirrors/un/uncrustify Uncrustify是一个功能强大的代码美化工具,专门用于格式化C、C、C#、Objective-C、D、Java、…...

P3C代码规范检查:风险驱动架构下的动态治理策略

P3C代码规范检查:风险驱动架构下的动态治理策略 【免费下载链接】p3c Alibaba Java Coding Guidelines pmd implements and IDE plugin 项目地址: https://gitcode.com/gh_mirrors/p3/p3c 在数字化转型浪潮中,企业级Java应用面临代码质量与开发效…...

【原创改进代码】基于信息间隙决策理论的多能系统-阶梯碳交易优化调度附Python代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...

IPATool终极指南:如何用命令行轻松获取iOS应用安装包?

IPATool终极指南:如何用命令行轻松获取iOS应用安装包? 【免费下载链接】ipatool Command-line tool that allows searching and downloading app packages (known as ipa files) from the iOS App Store 项目地址: https://gitcode.com/GitHub_Trendin…...

Three.js面试必备:从光源类型到性能优化的20个高频考点解析

Three.js面试深度攻略:从核心原理到性能优化的20个技术要点 当面试官抛出"Three.js的光照系统如何影响渲染性能"这类问题时,你是否能条理清晰地拆解环境光与平行光的计算差异?面对"如何实现自定义着色器优化建筑可视化项目的渲…...

课灵h5p-标签页 (Tabs)教程

标签页 (Tabs)教程 标签页 (Tabs) 是一种高效的内容容器,通过水平切换的选项卡界面来组织信息。它允许你在同一页面空间内并行展示多个同层级的主题(如不同类别的资源、不同语言的版本),帮助学习者按需浏览,保持界面整…...

Python 学习笔记:学习路线图规划

1989 年的圣诞节期间,时任荷兰数学和计算机科学研究学会(CWI)研究员的 Guido van Rossum[1] 决定基于 ABC 语言设计并实现一门新的脚本编程语言,最初目的是用于替代 Unix shell 和部分 C 程序,以承担 Amoeba 分布式操作…...

Captain AI帮你一次过审,上品不再被驳回!

Ozon上品审核驳回、上架后违规下架,是90%以上卖家都踩过的坑。很多卖家遇到上品问题,会用DeepSeek等通用AI查询规则,却往往因为信息滞后、规则解读错误,反复修改仍无法过审,白白错过新品流量黄金期。一、Captain AI能帮…...

告别手动配置:用快马AI生成openclaw自动化安装与环境管理脚本

作为一名经常需要配置各种开发环境的程序员,我深刻体会到手动安装工具的繁琐。最近在搭建一个爬虫项目时需要用到openclaw,发现传统安装方式存在几个明显的效率痛点: 版本查找耗时:需要反复在官网和文档间切换,确认最…...