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_PLAIN
            channel.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_PLAIN
            channel.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_PLAIN
            channel.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");

    }
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信Windows版如何从旧电脑迁移聊天记录到新电脑

我们都知道&#xff0c;换手机的话&#xff0c;如果是同品牌&#xff0c;可以用该品牌的换机助手将微信资料传输给新手机&#xff0c;或者用微信PC端的迁移与备份功能来实现 那么换电脑或者重装系统呢&#xff1f;我们可以通过转移文件夹的方式进行 1、登录PC微信&#xff0c;…

选择最适合您的10个在线PS类型工具

Adobe Photoshop 多年来&#xff0c;Photoshop一直是设计师的首选。PS的功能无疑是非常强大的。设计师可以使用它来制作从简单的网页到复杂的移动应用程序设计。学习PS的基本知识很容易&#xff0c;但学习PS的所有技能都需要大量的时间和精力。当然&#xff0c;您也可以选择体…

哈希表-散列表数据结构

1、什么是哈希表&#xff1f; 哈希表也叫散列表&#xff0c;哈希表是根据关键码值(key value)来直接访问的一种数据结构&#xff0c;也就是将关键码值(key value)通过一种映射关系映射到表中的一个位置来加快查找的速度&#xff0c;这种映射关系称之为哈希函数或者散列函数&…

环境变量的使用

1.用法 1.建立文件夹.env.production&#xff08;开发&#xff09;.env.development(生产) 代码: NODE_ENVdevelopment VUE_APP_BASE_APIwww.aaa.comNODE_ENVproduction VUE_APP_BASE_APIwww.xxx.com 注意: 环境变量的文件夹应该是和src目录同级的: 2.获取 process.env.V…

vue+springboot+mybatis-plus实现乡村公共文化服务系统

项目前端&#xff1a;https://gitee.com/anxin-personal-project/rural-public-cultural-services-front 项目后端&#xff1a;https://gitee.com/anxin-personal-project/rural-public-cultural-services-behind 1.系统简介 乡村公共服务文化提供给管理员、商家、村民。管理…

二次电池的自放电

一、自放电概念 电池在开路状态时&#xff0c;其存储的电量自发被消耗的现象称为电池的自放电&#xff0c;又称电池的荷电保持能力&#xff0c;即在一定环境条件下&#xff0c;电池储存电量的保持能力。自放电也是衡量电池性能的重要参数之一&#xff0c;不同类型的电池自放电因…

过节购物怎么划算?用C语言爬虫采集京东优惠券

年关将至&#xff0c;喜迎春节&#xff0c;各家各户都忙着置办年货&#xff0c;农村逛集市&#xff0c;而城市里面的&#xff0c;尤其是年轻人最喜欢的是网购了&#xff0c;网购产品种类多&#xff0c;齐全非常方便。今天我就利用我学的技能&#xff0c;帮助大家爬取京东优惠券…

学生如何正确使用台灯?精选最合适学生使用的台灯

如今我国青少年儿童的近视率非常高&#xff0c;已经超过了50%&#xff0c;并且这个近视率还在逐年上升&#xff0c;近视的年龄也越来越趋势于低龄化&#xff0c;不少还未上学或者正在上小学的孩子都早早戴上了近视眼镜。因此许多家长都纷纷给孩子选购一台专业的护眼台灯&#x…

Docker实战09|使用AUFS包装busybox

前几篇文章中&#xff0c;重点讲解了如何实现构建容器&#xff0c;需要回顾的小伙伴可以看以下文章&#xff1a; 《Docker实战06&#xff5c;深入剖析Docker Run命令》《Docker实战07&#xff5c;Docker增加容器资源限制》《Docker实战08&#xff5c;Docker管道及环境变量识别…

服务器里面打开浏览器访问不了会是什么原因

我们在日常使用服务器的过程中&#xff0c;时常会有遇到各类情况&#xff0c;近日就有遇到用户联系到德迅云安全&#xff0c;反馈自己在服务器里面打不开浏览器&#xff0c;服务器里面没有网络无法访问的情况。那我们今天就来讲下服务器里面打不开网站可能是由哪些原因导致。 …

雍禾植发袁宣心中有“术”,雍禾医疗帮用户重启人生

从公立医院烧伤外科来到雍禾&#xff0c;可以说是袁宣职业生涯里最重要的一个决定。据了解&#xff0c;袁宣医生所在的雍禾植发&#xff0c;是国内最大的毛发医疗机构。截至2022年12月31日&#xff0c;雍禾医疗已组建1341人的专业医疗团队&#xff0c;其中毛发医生294人&#x…

什么是活动的DWDM网络?

DWDM系统被认为是一个基于应答器的系统&#xff0c;可以帮助在数据中心互连设置中在站点之间传输大量数据。不同于无源DWDM网络&#xff0c; DWDM网络通常包括OEO、主动DWDM Mux Demux、EDFA、DCM和其他主动WDM组件&#xff0c;更适合远程传输。此外&#xff0c;主动DWDM网络还…

windows rtmp发送数据流程抓包

一、connect 返回Window Acknowledgement Size&#xff1a; 返回Set Peer Bandwidth 二、 releaseStream 三、 FCPublish 四、 createStream 五、 _checkbw 六、 FCPublish返回 七、createStream 八、 _checkbw返回 九、发送关键帧 十、发送视频帧 十一、FCUnpublish 十二、del…

数据库开发工具Navicat Premium 15 mac软件特色

Navicat Premium 15 mac版是一款数据库开发工具&#xff0c;Navicat Premium 15 Mac版可以让你以单一程序同時连接到 MySQL、MariaDB、SQL Server、SQLite、Oracle 和 PostgreSQL 数据库。 Navicat Premium mac软件特色 无缝数据迁移 数据传输&#xff0c;数据同步和结构同步…

orangepi 4lts 无线网卡wlan0隔几个小时自动掉线解决

发现问题&#xff1a;最近使用orangepi 4lts有线(内网&#xff09;和无线&#xff08;外网&#xff09;&#xff0c;同时连接&#xff0c;无线都是隔半天就掉线&#xff0c;不能自动重连 无线网卡关闭节能模式 1、查看无线网卡的运行状态 sudo iwconfig wlan0 状态说明&…

控制障碍函数(Control Barrier Function,CBF) 三、代码

三、代码实现 3.1、模型 这是一个QP问题&#xff0c;所以我们直接建模 这其实还是之前的那张图&#xff0c;我们把这个大的框架带入到之前的那个小车追击的问题中去&#xff0c;得到以下的一些具体的约束条件 CLF约束 L g V ( x ) u − δ ≤ − L f V ( x ) − λ V ( x ) …

合宙海外模组硬核出击,Air780UAAir780UU全新上市

简介 随着国内市场竞争日趋激烈&#xff0c;企业产品出海已呈如火如荼之势&#xff0c;向外发展拼商机更需硬核优势。 合宙作为物联网行业的核心器件提供商&#xff0c;将逐步推出系列高性价比海外模组&#xff0c;全面助力行业客户出海。现针对亚太、欧洲地区&#xff0c;全…

【语义解析:连接自然语言与机器智能的桥梁】

语义解析&#xff1a;连接自然语言与机器智能的桥梁 语义解析技术可以提高人机交互的效率和准确性&#xff0c;在自然语言处理、数据分析、智能客服、智能家居等领域都有广泛的应用前景。特别是在大数据时代&#xff0c;语义解析能够帮助企业更快速地从大量的数据中获取有用的…

什么是HTTP协议以及对HTTP协议的见解

目录 HTTP协议 &#xff08;1&#xff09;什么是http协议 &#xff08;2&#xff09;http协议的特点&#xff1a; &#xff08;3&#xff09;http协议请求头 &#xff08;4&#xff09;http协议响应头 HTTP协议 &#xff08;1&#xff09;什么是http协议 http&#xff0…