RabbitMQ发布确认

1.单个确认

单个确认发布是一种同步确认发布方式,也就是发布一个消息后只有它被确认发布,后续的消息才能继续发布。
缺点:发布速度特别慢,因为若是没有确认发布的消息会阻塞所有后续消息的发布

package com.hong.rabbitmq5;import com.hong.utils.RabbitMQUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.MessageProperties;import java.util.UUID;/*** @Description: 发布确认-单个确认发布* 单个确认发布是一种同步确认发布方式,也就是发布一个消息后只有它被确认发布,后续的消息才能继续发布。* 缺点:发布速度特别慢,因为若是没有确认发布的消息会阻塞所有后续消息的发布* @Author: hong* @Date: 2023-12-21 20:52* @Version: 1.0**/
public class Task5 {public static void main(String[] args) throws Exception{String queueName = UUID.randomUUID().toString();Channel channel = RabbitMQUtil.getChannel();//队列持久化   true持久化channel.queueDeclare(queueName,true,false,false,null);//开启发布确认  默认关闭channel.confirmSelect();long startTime = System.currentTimeMillis();for(int i = 0; i <= 1000; i++){String message = i + "";//消息持久化  MessageProperties.PERSISTENT_TEXT_PLAINchannel.basicPublish("",queueName, MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes("UTF-8"));//发布就确认boolean flag = channel.waitForConfirms();if(flag){System.out.println("第"+i+"个消息发布成功!");}}long endTime = System.currentTimeMillis();System.out.println("发布1000个消息单个确认发布总耗时:"+(endTime - startTime)+"ms");}
}

在这里插入图片描述

2. 批量确认

批量确认发布也是一种同步确认发布方式,一批确认一次,相比单个确认发布极大地提升了吞吐量
缺点:一旦出故障难以确认到底是哪个消息出问题了

package com.hong.rabbitmq5;import com.hong.utils.RabbitMQUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.MessageProperties;import java.util.UUID;/*** @Description: 批量确认发布* 批量确认发布也是一种同步确认发布方式,一批确认一次,相比单个确认发布极大地提升了吞吐量* 缺点:一旦出故障难以确认到底是哪个消息出问题了* @Author: hong* @Date: 2024-01-03 17:44* @Version: 1.0**/
public class BatchConfirmPublish {public static void main(String[] args) throws Exception {String queueName = UUID.randomUUID().toString();Channel channel = RabbitMQUtil.getChannel();//队列持久化   true持久化channel.queueDeclare(queueName,true,false,false,null);//开启发布确认  默认关闭channel.confirmSelect();//100个确认一次int batchSize = 100;long startTime = System.currentTimeMillis();for(int i = 1; i <= 1000; i++){String message = i + "";//消息持久化  MessageProperties.PERSISTENT_TEXT_PLAINchannel.basicPublish("",queueName, MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes("UTF-8"));if(i%batchSize == 0){//发布就确认channel.waitForConfirms();}}long endTime = System.currentTimeMillis();System.out.println("发布1000个消息,批量确认发布总耗时:"+(endTime - startTime)+"ms");}
}

在这里插入图片描述

3. 异步确认

package com.hong.rabbitmq5;import com.hong.utils.RabbitMQUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.ConfirmCallback;
import com.rabbitmq.client.MessageProperties;import java.util.UUID;
import java.util.concurrent.ConcurrentNavigableMap;
import java.util.concurrent.ConcurrentSkipListMap;/*** @Description: 异步确认发布* @Author: hong* @Date: 2024-01-06 20:41* @Version: 1.0**/
public class AsynConfirmPublish {public static void main(String[] args) throws Exception {Channel channel = RabbitMQUtil.getChannel();//队列的声明String queueName = UUID.randomUUID().toString();//队列持久化   true持久化channel.queueDeclare(queueName,true,false,false,null);//开启发布确认  默认关闭channel.confirmSelect();ConcurrentSkipListMap<Long,String> concurrentSkipListMap =new ConcurrentSkipListMap<>();//消息确认回调的函数ConfirmCallback ackCallback = (deliveryTag, multiple) ->{if(multiple) {//2.删除掉已经确认的消息 剩下的就是未确认的消息ConcurrentNavigableMap<Long, String> confirmed =concurrentSkipListMap.headMap(deliveryTag);confirmed.clear();}else {concurrentSkipListMap.remove(deliveryTag);}System.out.println("确认的消息:" + deliveryTag);};//消息确认失败回调函数ConfirmCallback nackCallback= (deliveryTag,multiple) ->{//3.打印一下未确认的消息都有哪些String message = concurrentSkipListMap.get(deliveryTag);System.out.println("未确认的消息tag:"  + deliveryTag + "-----------未确认的消息是:" + message);};/** 消息的监听器   异步通知*/channel.addConfirmListener(ackCallback,nackCallback);long begin = System.currentTimeMillis();//批量发送消息for (int i = 1; i <= 1000; i++) {String message= "消息" + i;//消息持久化  MessageProperties.PERSISTENT_TEXT_PLAINchannel.basicPublish("",queueName, MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes("UTF-8"));//1.此处记录下所有要发送的消息 消息的总和concurrentSkipListMap.put(channel.getNextPublishSeqNo(),message);}//结束时间long end = System.currentTimeMillis();System.out.println("发布1000个消息,异步确认消息总耗时:"+(end-begin)+"ms");}
}

在这里插入图片描述

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

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

相关文章

C# 反射的乌云,MethodInfo的Json序列化参数入参问题

文章目录 前言直接运行MethodInfo运行结果 Json解决ParamterInfo实例化运行结果无法实例化问题部分参数的问题 Json反序列化 经过长达一天的研究&#xff0c;我终于完全的解决的了实战思路方法测试用例运行测试运行结果 代码总结总结 前言 我上篇文章已经基本解决了反射的基本…

vivado 创建编译后工程

创建后期合成项目 合成后项目以合成网表、完全生成的块设计、完全生成的IP以及相应的约束。然后&#xff0c;您可以分析、布局和实施设计 注意&#xff1a;您可以使用XST或第三方合成工具来创建合成网表。 重要&#xff01;使用EDIF和NGC文件时&#xff0c;顶部单元格名称必…

OpenAI ChatGPT-4开发笔记2024-03:Chat之Tool和Tool_Call(含前function call)

Updates on Function Calling were a major highlight at OpenAI DevDay. In another world,原来的function call都不再正常工作了&#xff0c;必须全部重写。 function和function call全部由tool和tool_choice取代。2023年11月之前关于function call的代码都准备翘翘。 干嘛…

Python操作excel-读取、表格填充颜色区分

1.场景分析 遇到一个需要读取本地excel数据&#xff0c;处理后打入到数据库的场景&#xff0c;使用java比较重&#xff0c;python很好的解决了这类问题 2.重难点 本场景遇到的重难点在于&#xff1a; 需要根据表格内的背景颜色对数据进行筛选 读取非默认Sheet 总是出现Value…

vue3 封裝一个常用固定按钮组件(添加、上传、下载、删除)

效果图 这个组件只有四个按钮&#xff0c;添加&#xff0c;上传、下载、删除&#xff0c;其中删除按钮的颜色默认是灰色&#xff0c;当表格有数据选中时再变成红色 实现 组件代码 <script lang"ts" setup> import { Icon } from /components/Icon/index im…

swaggerUI不好用,试试这个openapiUI?

title: swaggerUI不好用&#xff0c;试试这个openapiUI? date: 2024-01-08 categories: [tool] tags: [openapi,工具] description: 基于swaggger2, openapi3规范的UI文档 1.背景 由于长期使用 swaggerUI 工具&#xff0c;它的轻量风格个人觉得还是不错的&#xff0c;但是它…

在python里面探索web框架

一、常识性知识 python Web框架三巨头&#xff1a;Flask&#xff08;简单易学&#xff09;、Django(复杂庞大)、FastAPI 1. Django&#xff1a;Django是一个高级的Web框架&#xff0c;它提供了强大的功能和工具&#xff0c;用于快速开发复杂的Web应用程序。 2. Flask&#xff…

Nginx配置反向代理实例一

Mac 安装Nginx教程 提醒一下&#xff1a;下面实例讲解是在Mac系统演示的&#xff1b; 反向代理实例一实现的效果 在浏览器地址栏输入www.testproxy.com, 跳转到系统Tomcat主页面。 反向代理准备工作 第一步&#xff1a;在系统的 hosts 文件进行ip和域名对应关系的配置。 …

Pytest自动化测试框架

1、pytest简介 pytest是Python的一种单元测试框架&#xff0c;与python自带的unittest测试框架类似&#xff0c;但是比unittest框架使用起来更简洁&#xff0c;效率更高。 执行测试过程中可以将某些测试跳过&#xff0c;或者对某些预期失败的case标记成失败能够支持简单的单元…

蜗牛目标检测数据集VOC格式480张

蜗牛&#xff0c;一种缓慢而坚韧的软体动物&#xff0c;以其螺旋形的外壳和黏附力极强的黏液而为人所熟知。 蜗牛体型呈螺旋形&#xff0c;有一个硬壳保护其柔软的身体。壳的形状和纹理因种类而异&#xff0c;有的光滑如玻璃&#xff0c;有的则布满细纹。蜗牛的头部有两对触角…

【算法Hot100系列】在排序数组中查找元素的第一个和最后一个位置

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…