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

news2024/9/20 1:14:31

文章目录

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

🍃前言

本次开发任务:

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

🌲添加绑定

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

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

  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.coloradmin.cn/o/1533239.html

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

相关文章

UE4 Json事件设置Asset值

通过Json事件来设置,比如骨骼网格体(换皮)等等

用Python直接获取Word文档页数、字数、段落数、节数等信息

计算 Word 文档的页数、字数等信息是出版、学术和内容管理等领域的一项基本任务。准确的页数和字数对于评估文档长度、估算印刷成本、分析文本复杂性以及确保符合格式化指南至关重要。逐个预览文档查看相关信息是非常麻烦的事情,我们可以在不预览文档的情况下&#…

Day74:WEB攻防-机制验证篇重定向发送响应状态码跳过步骤验证码回传枚举

目录 验证码突破-回传显示&规律爆破 某目标回显显示 某APP验证码爆破 验证目标-重定向用户&重定向发送 某CMS重定向用户 某CMS重定向发送 验证逻辑-修改响应包&跳过步骤URL 某APP修改响应包 某APP跳过步骤URL 实战SRC验证逻辑挖掘分享案例 短信验证码回…

集成学习 | 集成学习思想:Boosting

目录 二. Boosting思想1. Adaboost 算法1.1 Adaboost算法构建流程1.2 sklearn库参数说明 2. Gradient Boosting 算法2.1 Gradient Boosting算法构建流程2.2 Gradient Boosting算法的回归与分类问题2.2.1 Gradient Boosting回归算法均方差损失函数绝对误差损失函数 2.2.2 Gradie…

使用 Dify 和 AWS Bedrock 玩转 Anthropic Claude 3

本篇文章,聊聊怎么比较稳定的使用 Anthropic Claude 3,以及基于目前表现非常好的模型,来做一些有趣的 AI Native 小工具。 写在前面 在实际体验了半个多月,月初上线的 Anthropic Claude Pro 后,发现 Claude 3 系列模…

不同的Git仓库单独设置用户名和邮件地址

最近使用公司电脑将自己的一个私人项目推送到远程仓库,仓库显示的公司邮箱地址。因为设置了全局的username和usermail,这样就比较尴尬了。但是又不能频繁来回改用户信息,那么请看下面如何单独设置仓库的用户信息,让不同的仓库展示…

怎么轻松制作证件照?推荐这三款制作工具!

在日常生活中,我们经常需要制作各种证件照,如身份证、护照、驾驶证等。为了帮助大家快速、便捷地制作证件照,我将在本文中推荐三款优秀的证件照制作工具,包括国内外的软件,满足不同用户的需求。1.水印云 水印云是一款国…

自动推送个人站点到百度收录

自动推送个人站点到百度收录 准备 验证站点 访问百度收录官网注册帐号选择用户中心-站点管理 在“站点管理”里面点击“添加站点”,填写你的站点地址(支持子域名) 根据你的站点的内容、类型勾选站点属性 点击“验证站点”。 两种方式都可以…

学点儿Java_Day6_面向对象:类、封装、构造方法

1 类 1.1 定义 类:对现实世界中事物的抽象。Student 对象:现实世界中具体的个体。张三、李四 这些具体的学生 面向对象的特征:抽象、封装、继承、多态 OOP: Object Oriented Programming 类和对象的总结: 1、现实世界都是由很多…

GO-初识包管理

初识包管理,知道项目中文件和文件夹之间的关系 输出,代码,在go编译器运行时会显示在屏幕中 初识数据类型 整型,数字。例如:1、2、3、4 字符串类型,表示文本信息的。例如:“张三”“李四” 布尔类型&#x…

windows docker

写在前面的废话 最近在学习riscv的软件相关内容,倒是有别人的sg2042机器可以通过ssh使用,但是用起来太不方便了,经常断掉,所以想着在自己的机器上跑一跑riscv的操作系统。最常见的有两种方法吧,第一个就是qemu&#xf…

x-zse-96,android端,伪dex加固,so加固,白盒AES,字符串加密

x-zse-96,android端,伪dex加固,so加固,白盒AES,字符串加密 上一篇某招聘软件的sig及sp参数被和谐掉了,所以懂得都懂啊! 因为web的api没有那么全,所以来看了下app的,ios的防护几乎没有,纸糊的一样,android端的有点复杂了,到最后我也没能完整的实现整个加密过程,我也只复现到DF…

探讨苹果 Vision Pro 的空间视频(术语辨析、关键技术、思考)

背景:一位资深视频技术从业者在 Pixvana 工作,积累了丰富的捕获、处理、编码、流传和播放空间媒体经验。 一、术语 空间视频:传统的 3D 视频,呈矩形,包含左右眼视图,如 iPhone15 Pro 和 Vision Pro 可录制。沉浸式视频:非矩形的环绕式视频体验,通常由两个或多个传感器…

亮数据代理IP轻松解决爬虫数据采集痛点

文章目录 一、爬虫数据采集痛点二、为什么使用代理IP可以解决?2.1 爬虫和代理IP的关系2.2 使用代理IP的好处 三、亮数据代理IP的优势3.1 IP种类丰富3.1.1 动态住宅代理IP3.1.2 静态住宅代理IP3.1.3 机房代理IP3.1.4 移动代理IP 3.2 高质量IP全球覆盖3.3 超级代理服务…

​《个人信息出境标准合同办法》第四条中的100万、10万、1万是指人数还是个人信息的条数?​

《个人信息出境标准合同办法》第四条中的100万、10万、1万是指人数还是个人信息的条数? 本条中的3个数字均指的是人数,不是条数。举个极端的例子,从目前的规定来说,如果某企业的国内用户人数超过了100万,即便向境外接收…

由浅到深认识Java语言(11):封装

该文章Github地址:https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.c…

容器中的大模型(三)| 利用大语言模型:容器化高效地部署 PDF 解析器实践...

作者:宋文欣,智领云科技联合创始人兼CTO 01 简介 大语言模型(LLMs)正逐渐成为人工智能领域的一颗璀璨明星,它们的强大之处在于能够理解和生成自然语言,为各种应用提供了无限可能。为了让这些模型更好地服务…

Android 10.0 app获取当前已连接wifi列表ssid和密码功能实现

1.前言 在10.0的系统定制化开发中,在一些关于wifi的定制中,有产品需求app中要求获取当前连接wifi和密码功能,在系统原生wifi中 是禁止获取wifi连接的密码的,所以就需要对wifi模块进行一部分的修改,来满足app中获取wifi的ssid和密码功能,接下来就来 实现这个功能 如图:…

idea 开发serlvet篮球秩序册管理系统idea开发mysql数据库web结构计算机java编程layUI框架开发

一、源码特点 idea开发 java servlet 篮球秩序册管理系统是一套完善的web设计系统mysql数据库 系统采用serlvetdaobean mvc 模式开发,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 servlet 篮…

【MySQL】数据库的基础概念

👦个人主页:Weraphael ✍🏻作者简介:目前学习计网、mysql和算法 ✈️专栏:MySQL学习 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论&#x1f4ac…