【消息队列开发】 虚拟主机设计——操作绑定

文章目录

  • 🍃前言
  • 🌲添加绑定
  • 🌳删除绑定
  • ⭕总结

🍃前言

本次开发任务:

  • 实现对绑定的添加与绑定

🌲添加绑定

对于绑定的操作相较于前面对交换机和队列的操作就会麻烦一点了

我们分为以下七步来实现:

  1. 对传入的队列名与交换机名字进行重命名

  2. 获取绑定是否存在,若存在,直接返回即可

  3. 验证 bindingKey 是否合法.

    1. 该步骤我们另外创建一个类,创建相应的方法,来判定验证 bindingKey 是否合法.
    2. 这里先不关心具体实现细节,后面会一一实现
    3. 在这里插入图片描述
    4. 在这里插入图片描述
  4. 创建bing对象

  5. 获取相应的交换机与队列对象,若有一个不存在,则不存在绑定关系

  6. 写入硬盘时,我们需要交换机与队列都持久化,才将该绑定写入硬盘

  7. 写入内存

同样我们需要为了线程安全,我们需要进行加锁操作,由于我们该操作既涉及了交换机,有涉及了队列。所以我们这里需要进行双重加锁。

同时不要忘了进行异常处理,代码实现如下:

//添加绑定
public boolean queueBind(String queueName, String exchangeName, String bindingKey) {queueName = virtualHostName + queueName;exchangeName = virtualHostName + exchangeName;try {synchronized (exchangeLocker) {synchronized (queueLocker) {// 1. 判定当前的绑定是否已经存在了.Binding existsBinding = memoryDataCenter.getBinding(exchangeName, queueName);if (existsBinding != null) {throw new MqException("[VirtualHost] binding 已经存在! queueName=" + queueName+ ", exchangeName=" + exchangeName);}// 2. 验证 bindingKey 是否合法.if (!router.checkBindingKey(bindingKey)) {throw new MqException("[VirtualHost] bindingKey 非法! bindingKey=" + bindingKey);}// 3. 创建 Binding 对象Binding binding = new Binding();binding.setExchangeName(exchangeName);binding.setQueueName(queueName);binding.setBindingKey(bindingKey);// 4. 获取一下对应的交换机和队列. 如果交换机或者队列不存在, 这样的绑定也是无法创建的.MSGQueue queue = memoryDataCenter.getQueue(queueName);if (queue == null) {throw new MqException("[VirtualHost] 队列不存在! queueName=" + queueName);}Exchange exchange = memoryDataCenter.getExchange(exchangeName);if (exchange == null) {throw new MqException("[VirtualHost] 交换机不存在! exchangeName=" + exchangeName);}// 5. 先写硬盘if (queue.isDurable() && exchange.isDurable()) {diskDataCenter.insertBinding(binding);}// 6. 写入内存memoryDataCenter.insertBinding(binding);}}System.out.println("[VirtualHost] 绑定创建成功! exchangeName=" + exchangeName+ ", queueName=" + queueName);return true;} catch (Exception e) {System.out.println("[VirtualHost] 绑定创建失败! exchangeName=" + exchangeName+ ", queueName=" + queueName);e.printStackTrace();return false;}
}

🌳删除绑定

关于删除绑定,我们分为以下四步实现:

  1. 对传入的队列名与交换机名字进行重命名
  2. 查询相应绑定是否存在,若不存在,直接返回即可
  3. 若存在,无论绑定是否持久化了, 都尝试从硬盘删一下. 就算不存在, 这个删除也无副作用.
  4. 删除内存数据

需要特别注意的是,为了线程安全,我们依旧需要进行加锁操作。

而且加锁顺序一定要与上面增加绑定的顺序相同,不然可能会出现死锁。

最后不要忘了处理异常即可,代码实现如下:

//删除绑定
public boolean queueUnbind(String queueName, String exchangeName) {queueName = virtualHostName + queueName;exchangeName = virtualHostName + exchangeName;try {synchronized (exchangeLocker) {synchronized (queueLocker) {// 1. 获取 binding 看是否已经存在~Binding binding = memoryDataCenter.getBinding(exchangeName, queueName);if (binding == null) {throw new MqException("[VirtualHost] 删除绑定失败! 绑定不存在! exchangeName=" + exchangeName + ", queueName=" + queueName);}// 2. 无论绑定是否持久化了, 都尝试从硬盘删一下. 就算不存在, 这个删除也无副作用.diskDataCenter.deleteBinding(binding);// 3. 删除内存的数据memoryDataCenter.deleteBinding(binding);System.out.println("[VirtualHost] 删除绑定成功!");}}return true;} catch (Exception e) {System.out.println("[VirtualHost] 删除绑定失败!");e.printStackTrace();return false;}

⭕总结

关于《【消息队列开发】 虚拟主机设计——操作绑定》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下

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

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

相关文章

【xr806开发板使用】连接wifi例程实现

##开发环境 win10 WSL ##1、环境配置 参考:https://aijishu.com/a/1060000000287513 首先下载安装wsl 和ubuntu https://docs.microsoft.com/zh-cn/windows/wsl/install (1)安装repo: 创建repo安装目录: mkdir ~/…

AI预测福彩3D第15弹【2024年3月21日预测--新算法重新开始计算第12次测试】

今天继续对第一套算法进行测试,废话不多说,直接上结果。 最终,经过研判分析,2024年3月21日福彩3D的七码预测结果如下: 百位:5 4 7 1 2 0 6 十位:3 5 1 2 0 4 6(9换6) 个位:2 0 1 3 4…

修改网站源码,给电子商城的商品添加图片时商品id为0的原因

修改网站源码,给电子商城的商品添加图片时商品id为0的原因。花了几个小时查找原因。后来,由于PictureControl.class.php是复制CourseControl.class.php而来,于是对比了这两个文件,在CourseControl.class.php找到了不一样的关键几条…

【算法】差分算法(空调)

可用于求一个数组要变为另一个数组最少要改变多少次的次数 Farmer John 的 N 头奶牛对他们牛棚的室温非常挑剔。 有些奶牛喜欢温度低一些,而有些奶牛则喜欢温度高一些。 Farmer John 的牛棚包含一排 N 个牛栏,编号为 1…N,每个牛栏里有一头…

【Linux系列】计算机系统中的架构与发行版:理解与区分

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

一文读懂MES和ERP的区别

MES(Manufacturing Execution System)系统是制造执行系统,位于上层的计划管理系统与生产过程的直接工业控制系统之间,是面向车间层的管理信息系统,能够对整个车间制造过程进行优化,实时收集生产过程中的数据…

LeetCode-60题:排列序列解法二(原创)

【题目描述】 给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。按大小顺序列出所有排列情况,并一一标记,当 n 3 时, 所有排列如下:"123" 、"132" 、"213" 、"231"、"312"、…

数字化转型:传统行业的新出路?

近年来,数字化转型已成为各行各业的热议话题。许多传统行业正面临着巨大的挑战,例如市场竞争加剧、成本上升、利润率下降等。数字化转型被视为传统行业破局的关键。那么,数字化转型究竟是不是传统行业的新出路呢? 传统行业面临的挑…

Qt 坐标位置转换

Qt 坐标位置转换 文章目录 Qt 坐标位置转换常见的位置坐标转换Qt窗体中常用坐标的区别与获取途径当前光标相对于屏幕的绝对位置当前光标相对于当前窗口的位置鼠标事件发生的位置窗体的位置判断鼠标光标是否悬浮在某个子控件上 从事Qt快一年了 ,在做坐标转换的时候容…

OpenCV4.9.0在Android 开发简介

查看:OpenCV系列文章目录(持续更新中......) 上一篇:使用 Clojure 进行 OpenCV 开发简介 下一篇:暂无 引言: OpenCV是一个跨平台计算机视觉库,广泛用于图像处理、计算机视觉和机器学习等领域…

python网络爬虫实战教学——urllib的使用(3)

文章目录 专栏导读1、urlsplit2、urlunsplit3、urljoin4、urlencode 专栏导读 ✍ 作者简介:i阿极,CSDN 数据分析领域优质创作者,专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》,本专栏针对大学生、…

日志集中审计系列(1)--- LogAuditor接收DAS设备syslog日志

日志集中审计系列(1)--- LogAuditor接收DAS设备syslog日志 前言拓扑图设备选型组网需求配置思路操作步骤结果验证前言 近期有读者留言:“因华为数通模拟器仅能支持USG6000V的防火墙,无法支持别的安全产品,导致很多网络安全的方案和产品功能无法模拟练习,是否有真机操作的…

群发短信后的实际效果统计分析

群发短信后的实际效果统计分析是评估短信营销效果的关键环节,有助于企业了解短信发送的效果,并据此优化营销策略。以下是对群发短信实际效果统计分析的详细探讨: 首先,企业需要关注短信的发送成功率。这包括短信是否成功发送至目标…

TinTin Web3 Bounty 挑战杯开启,Sui 向你发出挑战邀请!

2024 年开年最火的是什么? 对 Web3 来说,Bounty 任务应该是普通人获得行业“一杯羹”的重要捷径! 通过深入学习各类 Web3 技术,凭借实战锻炼开发创新项目,就有机会获得各大生态项目方的 Bounty 奖励。 TinTinLand 社…

TSINGSEE青犀数字化、智能化视频技术推动森林防火智慧监管

一、背景分析 中央网络安全和信息化委员会印发《“十四五”国家信息化规划》,明确指出“提升林草生态网络感知能力,完善生态系统保护成效数字化监测评估体系”。这为数字化系统建设引领了方向,中国林业信息化建设迈入了新的阶段,全…

HTML5语法总结

文章目录 一.HTML基本框架二.标题标签三.段落标签四.换行与水平线标签五.文本格式化标签(加粗、倾斜、下划线、删除线)六.图像标签扩展:相对路径,绝对路径与在线网址 七.超链接标签八.音频标签九.视频标签十.列表标签十一.表格标签扩展:表格结构标签合并…

[C/C++] -- 链表

C/C 中链表是一种常见的数据结构,用于存储和组织数据。链表由节点(Node)组成,每个节点包含数据和指向下一个节点的指针。链表相对于数组的优势在于可以动态地分配内存,插入和删除操作效率高,但访问元素的随…

MacOS 电脑如何通过自带terminal终端连接PostgreSQL

1、安装Postgre SQL客户端工具 brew install postgresql 2、连接到PostgreSQL (1)创建远程连接 psql -h hostname -U username -d database 其中,hostname 是 PostgreSQL 服务器的主机名或 IP 地址,username 是您的 PostgreS…

机器学习 - 预测训练模型

接着上篇博客机器学习-训练模型做进一步说明。 There are three things to make predictions (also called performing inference) with a PyTorch model: Set the model in evaluation mode (model.eval())Make the predictions using the inference mode context manager (…

学点Java_Day6_基于Copyright和Actions On Save的IDEA自动更新文件最后编辑时间的方法研究(IDEA2021.2及以上)

0 版本要求 IDEA2021.2及以上,我用的IntelliJ IDEA 2023.2.4 1 操作 1.1 Copyright设置 ① CtrlAltS打开设置(Settings)→ Editor → Copyright   ② Copyright → Copyright Profiles → → 取名 → OK   ③ 复制下面内容到框里&am…