轮子项目--消息队列的实现(3)

news2025/2/12 10:05:54

        上一篇文章中我把一些关键的类以及表示出来,如何对这些类对应的对象进行管理呢?管理分为硬盘和内存上,硬盘又分为数据库(管理交换机,队列和绑定)和文件(管理消息),本文就是讨论的数据库上的管理。

        此处为了使用更加方便,简化环境,采用更加轻量的数据库——SQLite,它是一个本地数据库,相当于直接操作本地的硬盘文件。

        当在idea中配置好SQLiite数据库后,就需要建库建表,由于把配置依赖准备好之后就会自动的建库,因此我们这里主要关注的是建表,数据库存储的是交换机,队列和绑定,因此应该针对三者建立不同的表。可以根据之前创建的核心类进行设计表。那么上述的建表操作什么时机来执行,可能程序需要反复部署多次,为了简化部署的步骤,可以通过代码,自动完成建表的操作。

        为了自动完成建表操作,首先创建一个接口,内有需要建表的方法,然后实现对应的xml文件,通过xml实现接口中的抽象方法。对与建表操作我们使用undata标签。最终,我们根据定义的类建立了三张表,但是对于其中的arguments,由于是Map属性, 为了把arguments 存到数据库中,需要把Map转化为json格式的字符串。

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface MetaMapper {
    // 三个核心建表方法
    void createExchangeTable();
    void createQueueTable();
    void createBindingTable();
}

        当前,是把每个建表语句,都单独的列为一个 update 标签, 并且对应一个 java 方法,能否改成,一个 update 标签中包含多个 建表语句,同时借助一个 java 方法,完成上述多个表的创建呢? MyBatis 支持,一个 标签 中包含多个 sq| 语句的(前提是,搭配 MySQL 或者 Oracle).对于 SQLite,无法做到上述功能的,当你一个 update 标签中,写了多个 create table 语句的时候,只有第一个语句能执行.

        如何实现把 arguments 这个键值对,和数据库中的字符串类型相互转换呢? 关键在于, MyBatis 在完成数据库操作的时候,会自动的调用到对象的 getter 和 setter.

  • 比如 MyBatis 往数据库中写数据, 就会调用对象的 getter 方法,拿到属性的值,再往数据库中写。如果这个过程中,让 getArquments 得到的结果是 String 类型的,此时,就可以直接把这个数据写到数据库了
  • 比如 MyBatis 从数据库读数据的时候,就会调用对象的 setter 方法,把数据库中读到的结果设置到对象的属性中.如果这个过程中,让 setArguments,参数是一个 String,并且在 setArquments 内部针对字符串解析,解析成一个 Map 对象

因此我们需要自己写Exchange类的getArguments和setArguments方法,其中getArguments用于MyBatis 往数据库中写数据,因此将Map转为Json类型的字符串。从数据库读数据之后,构造Exchange对象,会自动调用到setArguments,是把arguments从json格式的字符串转化为Map

        第二个参数,用来描述当前 json 字符串, 要转成的 java 对象是什么类型的.如果是个简单类型,直接使用对应类型的类对象即可,如果是集合类这样的复杂类型,可以使用 TypeReference 匿名内部类对象,来描述复杂类型的具体信息,(通过泛型参数来描述的)

        对于 交换机 和 队列 这两个表,由于使用 name 作为主键,直接按照 name 进行删除即可,对于绑定来说,此时没有主键,删除操作,其实是针对 exchangeName 和 queueName 两个维度进行筛选.。之后需要在接口中声明三个核心增删方法,然后需要在xml文件中写出insert和delete语句。如下:

 其中的#{}:MyBatis 看到这个, 就会通过 getArguments 方法, 来获取到这个参数的内容,此处数据库中期望的类型是 String, 此处也就需要让 getArguments 能够得到 String。

        此时,我们把数据库的基本操作已经借助MyBatis封装完成。接下来写一个类整合上面的操作。首先是数据库的初始化,此处使用的是一个普通的方法。数据库的初始化=建库建表 +插入一些默认数据,我们期望, 在咱们的 broker server 启动的时候, 做出下列逻辑判定:
1.如果数据库已经存在了,(表啥的都有了),不做任何操作.
2.如果数据库不存在, 则创建库,创建表,构造默认数据

数据库判断是否存在就判定 meta.db 这个文件是否存在即可。根据以上逻辑编写完成代码之后,发现一些方法涉及到mapper的相关调用,那么此时mapper需要保证是被构造出来的,那么如何进行实例化?Mapper是通过Mybatis进行操作的,换句话说,Mapper已经被注册到spring里面了,直接从spring里面拿到现成的对象。常用是@Autowired,但是前提是外面的类是一个注册在spring中的对象,但是现在并不打算让类是一个Bean对象,因为后面还需要手动进行管理,然后构造整体的结构,因此此时不可以用@Autowired,需要手动的构造。在启动类添加一个静态成员,在下面的main方法中,将run方法的返回结果赋值到静态成员,此时借助这个静态成员可以手动的获取指定的bean对象了。接下来在类中完成接口的三个核心insert和delete方法,可以增加select操作。最后进行测试。

        设计单元测试要求,单元测试用例和用例之间是需要相互独立的,互不干扰的。因此可以这样子:每个用例执行之前,先执行一段逻辑,搭建测试的环境,准备好测试用的东西;每个用例执行之后,再执行一段逻辑,把用例执行过程中产生的中间结果的影响给消除掉。即“准备工作”和“收尾工作”,加上注解。

        准备工作:对数据库进行初始化操作,由于init方法需要手动获取metaMapper,依赖于context对象,因此在测试用例中也需要context对象.
        收尾工作:前面是数据库初始化,因此这里要清空数据库,在清空时注意此处不能直接就删除, 而需要先关闭上述 context 对象!! 此处的 context 对象, 持有了 MetaMapper 的实例, MetaMapper 实例又打开了 meta.db 数据库文件。如果 meta.db 被别人打开了, 此时的删除文件操作是不会成功的 (Windows 系统的限制, Linux 则没这个问题),另一方面, 获取 context 操作, 会占用 8080 端口. 此处的 close 也是释放 8080

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

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

相关文章

5.7.1 软件项目管理范围、成本估算、风险分析

文章目录 管理范围成本估算风险分析 管理范围 软件项目管理范围包含4P,即人员、产品、过程、项目。人员管理通过人员能力成熟度模型PCMM进行管理。产品管理需要制定产品目标,识别产品的总体目标,而不涉及细枝末节。产品范围,识别产…

Android新版高斯模糊(毛玻璃)官方实现,Kotlin

Android新版高斯模糊(毛玻璃)官方实现,Kotlin 从Android 12开始,Android官方API支持高斯模糊(毛玻璃)效果。关键是通过RenderEffect实现。 https://developer.android.com/reference/android/graphics/RenderEffecthttps://developer.android.com/refer…

仿 RabbitMQ 实现的简易消息队列

文章目录 项目介绍开放环境第三⽅库介绍ProtobufMuduo库 需求分析核⼼概念实现内容 消息队列系统整体框架服务端模块数据管理模块虚拟机数据管理模块交换路由模块消费者管理模块信道(通信通道)管理模块连接管理模块 客户端模块 公共模块日志类其他工具类…

实验9 基于WebGoat平台的SQL注入攻击

实验9 基于WebGoat平台的SQL注入攻击 1.实验目的 熟悉WebGoat平台,在该平台上实现SQL注入攻击。 2.实验内容 (1)下载webgoat-server-8.2.2.jar。 (2)搭建java环境。 (3)运行webgoat。 &#xf…

多光谱技术在华为手机上的应用发展历史

2018 年,华为 P20 系列首次搭载 5 通道色温传感器,可帮助手机在不同光照条件下保持画面色彩一致性。 2020 年,华为 P40 系列搭载 8 通道多光谱色温传感器(实际为 11 通道,当时只用 8 个通道检测可见光)&am…

如何免费白嫖 Deepseek API 接口

今天我将教大家如何利用网络空间测绘搜索引擎「Fofa」来寻找已经部署并开放 Deepseek 接口的服务。以下是详细步骤: 1. 访问 Fofa 搜索引擎 首先,打开 Fofa 搜索引擎的网站:https://fofa.info 2. 搜索开放的 Deepseek 接口 在搜索框中输入…

SaaS+AI应用架构:业务场景、智能体、大模型、知识库、传统工具系统

SaaSAI应用架构:业务场景、智能体、大模型、知识库、传统工具系统 大家好,我是汤师爷~ 在SaaS与AI应用的演进过程中,合理的架构设计至关重要。本节将详细介绍其五个核心层次: 业务场景层:发现和确定业务场景智能体层…

ios通过xib创建控件

之前写过ios动态创建控件及添加事件,纯手工代码写控件,虽然比较灵活,但是就是代码量比较多。这次我们通过xib来创建app下载列表项 AppView.xib。一个imageview,一个label,一个button构成 1.创建AppView.xib 2.再创建xib对应的mode&#xff0…

【树莓派Pico设备驱动】-WS2812B全彩LED驱动(基于SPI)

WS2812B全彩LED驱动(基于SPI) 文章目录 WS2812B全彩LED驱动(基于SPI)1、WS2812介绍2、WS2812配置4、驱动实现1、WS2812介绍 WS2812/WS2812B LED 使用 24 位来表示绿色、红色和蓝色值。 WS2812采用单线通信的设计,通信协议为非归零编码,每个LED需要24个bit的数据,数据依…

AIGC-微头条爆款文案创作智能体完整指令(DeepSeek,豆包,千问,Kimi,GPT)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…

2025届优秀创新大数据毕业设计

吊打导师的大数据毕业设计项目 985华南理工大学学长 大厂全栈,大数据开发工程师 专注定制化开发

解决 ComfyUI-Impact-Pack 中缺少 UltralyticsDetectorProvider 节点的问题

解决 ComfyUI-Impact-Pack 中缺少 UltralyticsDetectorProvider 节点的问题 1. 安装ComfyUI-Impact-Pack 首先确保ComfyUI-Impact-Pack 已经下载 地址: https://github.com/ltdrdata/ComfyUI-Impact-Pack 2. 安装ComfyUI-Impact-Subpack 由于新版本的Impact Pack 不再提供这…

SpringBoot中的Javaconfig

为什么要使用Javaconfig? 如果要声明的bean对象,来自于第三方jar包(不是自定义的),无法使用Component 及衍生注解来声明bean,因为第三方的jar一般不可写,需要使用注解Configuration和Bean注解来…

【前端】几种常见的跨域解决方案代理的概念

几种常见的跨域解决方案&代理的概念 一、常见的跨域解决方案1. 服务端配置CORS(Cross-Origin Resource Sharing):2. Nginx代理3. Vue CLI配置代理:4 .uni-app在manifest.json中配置代理来解决:5. 使用WebSocket通讯…

Windows11+PyCharm利用MMSegmentation训练自己的数据集保姆级教程

系统版本:Windows 11 依赖环境:Anaconda3 运行软件:PyCharm 一.环境配置 通过Anaconda Prompt(anaconda)打开终端创建一个虚拟环境 conda create --name mmseg python3.93.激活虚拟环境 conda activate mmseg 4.安装pytorch和cuda tor…

基于java手机销售网站设计和实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

如何评估云原生GenAI应用开发中的安全风险(下)

以上就是如何评估云原生GenAI应用开发中的安全风险系列中的上篇内容,在本篇中我们介绍了在云原生AI应用开发中不同层级的风险,并了解了如何定义AI系统的风险。在本系列下篇中我们会继续探索我们为我们的云原生AI应用评估风险的背景和意义,并且…

使用WebUI访问本地Deepseek(Ollama集成Open WebUI)

在《deepseek本地部署和使用(Linux虚拟机)》中,我们使用Ollama部署了Deepseek-r1,但是只能通过命令行方式交互,默认Ollama启动后,会启动一个监听到127.0.0.1,用以接收POST 请求,服务…

Word成功接入DeepSeek详细步骤

原理 原理是利用Word的VBA宏,写代码接入API。无需下载额外插件。 步骤一、注册硅基流动 硅基流动统一登录 注册这个是为了有一个api调用的api_key,有一些免费的额度可以使用。大概就是这个公司提供token,我们使用这个公司的模型调用deepsee…

房价预测/矿藏勘探/自然灾害预测……AI助力地球科学革新,浙大/清华/Google Research等已发表重要成果

地球科学作为一个高度跨学科的领域,正在经历一场由 AI 引领的重大变革。回顾 2024 年,研究人员在智慧城市建设、房价预测、海洋生态建模、地面沉降预测、洪水预测、山体滑坡预测、矿物预测等方面取得了一系列突破性成果。这些研究不仅展现了 AI 在处理复…