7.消息应答

消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个长时间的任务并且只完成了部分突然就挂掉了,会发生什么情况?

RabbitMQ一旦向消费者传递了一条消息,便立即将该消息标记为删除。这种情况下,突然有个消费者挂掉了,我们将丢失正在处理的消息。以及后续发送给该消费者的消息,也无法接收到。

为了保证消息在发送过程中不丢失,rabbitmq引入消息应答机制

消息应答机制

消费者在接收到消息并且处理该消息之后,告诉rabbitmq它已经处理了,rabbitmq可以把该消息删除了。

1.自动应答

并不完善。需要一个良好的环境,不发生极端的情况。使用较少。容易产生消息都是。

2.手动应答

Channel.basicAck用于肯定确认,RabbitMQ已知道该消息并且成功的处理消息,可以将其丢弃。

Channel.basicNack用于否定确认。

Channel.basicReject用于否定确认,不处理该消息了直接拒绝,可以将其丢弃。比basicNack方法少了一个参数。

multiple 手动应答的好处在于可以批量应答且减少网络拥堵。

basicAck方法第二个参数,multiple为true表示批量。

批量应答,会将信道中的消息都进行应答。如果不是批量应答,只会应答信道中当前这条消息。

建议不批量应答,以免造成消息的丢失。

消息自动重新入队

如果消费者由于某些原因失去连接(通道已关闭,连接已关闭,TCP连接丢失),导致消息未发送ack确认,RabbitMQ发现消息未完全处理,并将其重新排队。如果此时其他消费者可以处理,它将很快将其重新分配给其他消费者。这样即使某个消费者偶尔死亡,也可以确保不会丢失任何消息。

如果防止消息丢失?

rabbitmq中有消息应答机制,不要采用自动应答,需要一个良好的条件以及不能发生极端的情况,不建议使用。而是应该采用手动应答,手动应答又分为批量应答和非批量应答。批量应答会将信道里的消息都进行应答,不建议使用,以免造成消息丢失。非批量应答只会应答当前这条消息。

如果消息真的发生了丢失怎么办?

应该将消息自动重新入队

 代码

package com.xkj.org.mq.ack;import com.rabbitmq.client.Channel;
import com.xkj.org.utils.RabbitMQUtil;import java.io.IOException;
import java.util.Scanner;public class Task01 {private static final String QUEUE_NAME = "ack_queue";public static void main(String[] args) throws IOException {Channel channel = RabbitMQUtil.getChannel();//声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);//发送消息Scanner scanner = new Scanner(System.in);while(scanner.hasNext()) {String message = scanner.next();channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));}}
}
package com.xkj.org.mq.ack;import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import com.xkj.org.utils.RabbitMQUtil;import java.io.IOException;public class Worker01 {private static final String QUEUE_NAME = "ack_queue";public static void main(String[] args) throws IOException {Channel channel = RabbitMQUtil.getChannel();DeliverCallback deliverCallback = (consumerTag, message) -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("接受到消息:"+ new String(message.getBody(), "UTF-8"));//第一个参数,消息标记tag//第二个参数,false非批量应答channel.basicAck(message.getEnvelope().getDeliveryTag(), false);};CancelCallback cancelCallback = consumerTag -> {System.out.println("work1 消息消费被中断");};System.out.println("worker1等待1s接收消息.......");//设置手动应答channel.basicConsume(QUEUE_NAME, false, deliverCallback, cancelCallback);}}
package com.xkj.org.mq.ack;import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import com.xkj.org.utils.RabbitMQUtil;import java.io.IOException;public class Worker02 {private static final String QUEUE_NAME = "ack_queue";public static void main(String[] args) throws IOException {Channel channel = RabbitMQUtil.getChannel();DeliverCallback deliverCallback = (consumerTag, message) -> {try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("接受到消息:"+ new String(message.getBody(), "UTF-8"));//第一个参数,消息标记tag//第二个参数,false非批量应答channel.basicAck(message.getEnvelope().getDeliveryTag(), false);};CancelCallback cancelCallback = consumerTag -> {System.out.println("work2 消息消费被中断");};System.out.println("worker2等待10s接收消息.......");//设置手动应答channel.basicConsume(QUEUE_NAME, false, deliverCallback, cancelCallback);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/49990.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营day6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1.两数之和

文章目录 哈希表键值 哈希函数哈希冲突拉链法线性探测法 常见的三种哈希结构集合映射C实现std::unordered_setstd::map 小结242.有效的字母异位词思路复习 349. 两个数组的交集使用数组实现哈希表的情况思路使用set实现哈希表的情况 202. 快乐数思路 1.两数之和思路 总结 今天是…

OpenCV 遍历Mat,像素操作,使用TrackBar 调整图像的亮度和对比度 C++实现

文章目录 1.使用C遍历Mat,完成颜色反转1.1 常规遍历方式1.2 迭代器遍历方式1.3指针访问方式遍历(最快)1.4不同遍历方式的时间对比 2.图像像素操作,提高图像的亮度3.TrackBar 进度条操作3.1使用TrackBar 调整图像的亮度3.2使用TrackBar 调整图…

学术研讨 | 区块链网络体系结构研讨会顺利召开

添加图片注释,不超过 140 字(可选) 近日,国家区块链技术创新中心组织了“区块链网络体系结构研讨会”,会议面向跨域交互多、计算规模大、数据管理复杂、性能与扩展性要求高等特征的区块链网络的体系结构展开交流研讨&…

docker相关内容学习

一、docker的四部分 二、镜像相关命令 三、容器相关命令

视频生成【文章汇总】SVD, Sora, Latte, VideoCrafter12, DiT...

视频生成【文章汇总】SVD, Sora, Latte, VideoCrafter12, DiT... 数据集指标 【arXiv 2024】MiraData: A Large-Scale Video Dataset with Long Durations and Structured Captions【CVPR 2024】VBench : Comprehensive Benchmark Suite for Video Generative Models【arxiv 20…

学习记录——day15 数据结构 链表

链表的引入 顺序表的优缺点 1、优点:能够直接通过下标进行定位元素,访问效率高,对元素进行查找和修改比较快 2、不足:插入和删除元素需要移动大量的元素,效率较低 3、缺点:存储数据元素有上限,当达到MAX后,就不能再…

[python]数字与字符串

目录 Python 数字类型转换 Python 数字运算 Python字符串操作 修改 查询 Python 数字数据类型用于存储数值。 数据类型是不允许改变的,这就意味着如果改变数字数据类型的值,将重新分配内存空间。 Python 支持三种不同的数值类型: 整型…

javafx的ListView代入项目的使用

目录 1. 创建一个可观察的列表,用于存储ListView中的数据,这里的User是包装了用户的相关信息。 2.通过本人id获取friendid,及好友的id,然后用集合接送,更方便直观一点。 3.用for遍历集合,逐个添加。 4.渲染器&…

文件包涵条件竞争(ctfshow82)

Web82 利用 session.upload_progress 包含文件漏洞 <!DOCTYPE html> <html> <body> <form action"https://09558c1b-9569-4abd-bf78-86c4a6cb6608.challenge.ctf.show//" method"POST" enctype"multipart/form-data"> …

grafana对接zabbix数据展示

目录 1、初始化、安装grafana 2、浏览器访问 3、安装zabbix 4、zabbix数据对接grafana 5、如何导入模板&#xff1f; ① 设置键值 ② 在zabbix web端完成自定义监控项 ③ garafana里添加nginx上面的的三个监控项 6、如何自定义监控项&#xff1f; 以下实验沿用上一篇z…

【React学习打卡第三天】

Redux快速上手、三个核心概念、React组件使用、修改store的数据、提交action传参、异步操作、Redux调试 一、Redux快速上手1.概念2.快速体验(纯redux计数案例&#xff09; 3.三个核心概念 二、Redux与React-环境准备1.配套工具2.配置基础环境3.store目录结构设计![在这里插入图…

SpringMvc有几个上下文

你好&#xff0c;我是柳岸花明。 SpringMVC作为Spring框架的重要组成部分&#xff0c;其启动流程和父子容器机制是理解整个框架运行机制的关键。本文将通过一系列详细的流程图&#xff0c;深入剖析SpringMVC的启动原理与父子容器的源码结构。 SpringMVC 父子容器 父容器的创建 …

数据结构初阶(c语言)-双向链表

这里首先纠正上篇文章一个错误&#xff0c;链表的一个有效数据点应该称为结点而不是节点。 一&#xff0c;双向链表的概念与结构 1.1概念与结构示意图 我们所说的双向链表全称为带头双向循环链表&#xff0c;也就是说此链表带有哨兵位结点(不存放任何数据的结点&#xff0c;且…

【Git多人协作开发】知识点总结

目录 知识点总结 1.创建dev分支开发 1.1在本地创建 1.1在远程创建&#xff08;推荐&#xff09; 2.远程分支和本地分支建立连接☞pull和push操作 2.1情况1 2.2情况2 2.3情况3 3.本地仓库对远程仓库的拉取pull操作 3.1情况1 3.2情况2 4.将开发分支的内容合并到远程m…

【Week-G5】适用于图像翻译的pix2pix模型-Pytorch版本

文章目录 1、基础知识1.1 图像翻译1.2 CGAN1.3 U-Net1.4 Pix2Pix 2、运行代码 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 本次主要学习Pix2Pix网络&#xff0c;常用于图像翻译&#…

CVE-2020-7248 OpenWRT libubox标记二进制数据序列化漏洞(更新中)

提要 该文档会一直处于更新当中&#xff0c;当状态为完毕后&#xff0c;才是更新完成。由于网络上关于该漏洞原理的分析文档和资源实在是太少&#xff0c;而本人关于该方向也才是刚入门&#xff0c;能力有限&#xff0c;所以复现需要的时间较长&#xff0c;需要补充和学习的东西…

用Manim实现【多边形】类的实现——[上]

用Manim实现【多边形】类的实现——[上] Polygram内容是关于不同几何图形的分类&#xff0c;特别是涉及多边形&#xff08;Polygon&#xff09;及其扩展形式&#xff0c;比如多图形&#xff08;Polygram&#xff09;。在manim中有10中特征&#xff0c;接下来5种类及其特征的解…

搜维尔科技:Cyber​​glove通过其前所未有的柔性传感器技术,带来了多年的经验、专业知识和可靠性

Cyberglove 概述 新一代数据手套技术 MoCap 手套采用了原始 CyberGlove 产品 20 年经验所建立的技术&#xff0c;产生了改进的和新的特性、能力和设计&#xff0c;非常适合动作捕捉环境。 旧与新相遇&#xff0c; Cyberglove 通过其前所未有的柔性传感器技术&#xff0c;带来…

linux自动化构建工具--make/makefile

目录 1.make/makefile介绍 1.1基本认识 1.2依赖关系、依赖方法 1.3具体操作步骤 1.4进一步理解 1.5默认设置 1.6make二次使用的解释 1.7两个文件的时间问题 1.8总是被执行 1.9特殊符号介绍 1.make/makefile介绍 1.1基本认识 make是一个指令&#xff0c;makefile是一…

mysql面试(六)

前言 本章节详细讲解了一下mysql执行计划相关的属性释义&#xff0c;以及不同sql所出现的不同效果 执行计划 一条查询语句经过mysql查询优化器的各种基于成本和各种规则优化之后&#xff0c;会生成一个所谓的 执行计划&#xff0c;这个执行计划展示了这条查询语句具体查询方…