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

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

        此处为了使用更加方便,简化环境,采用更加轻量的数据库——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.mzph.cn/news/895278.shtml

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

相关文章

Svelte前端框架

Svelte 简介 Svelte 是一个现代的前端框架,用于构建高效、响应式的用户界面。与 React、Vue 和 Angular 等传统框架不同,Svelte 在构建时将组件编译为高效的纯 JavaScript 代码,而不是在浏览器中运行一个庞大的运行时库。这使得 Svelte 应用具…

【转载】开源鸿蒙OpenHarmony社区运营报告(2025年1月)

●截至2025年1月31日,开放原子开源鸿蒙(OpenAtom OpenHarmony,简称“开源鸿蒙”或“OpenHarmony”)社区累计超过8200名贡献者,共63家成员单位,产生51.2万多个PR、2.9万多个Star、10.5万多个Fork、68个SIG。…

@SneakyThrows:是Java异常处理的“魔法外挂“,还是隐藏的“定时炸弹“?

引言:当Java的异常机制成为"甜蜜的负担" Java的检查型异常(Checked Exception)设计本意是提升代码健壮性,但开发者常常陷入两难: 要么用try-catch层层包裹代码导致"金字塔噩梦",要么在…

双周报Vol.65:新增is表达式、字符串构造和数组模式匹配增强、IDE模式匹配补全增强...多项技术更新!

MoonBit更新 新增 is 表达式 这个表达式的语法形式为 expr is pat,这个表达式为 Bool 类型,当 expr 符合 pat 这个模式的时候返回 true,比如: fn use_is_expr(x: Int?) -> Unit {if x is Some(i) && i > 10 { .…

Git 与持续集成 / 持续部署(CI/CD)的集成

一、引言 在当今快速发展的软件开发领域,高效的代码管理和持续的交付流程是项目成功的关键因素。Git 作为一款分布式版本控制系统,已经成为了开发者们管理代码的标配工具;而持续集成 / 持续部署(CI/CD)则是一种能够加…

百问网imx6ullpro调试记录(linux+qt)

调试记录 文章目录 调试记录进展1.开发板相关1.1百问网乌班图密码 1.2 换设备开发环境搭建串口调试网络互通nfs文件系统挂载 1.3网络问题1.4系统启动1.5进程操作 2.QT2.1tslib1.获取源码2.安装依赖文件3.编译 2.2qt移植1.获取qt源码2.配置编译器3.编译 2.3拷贝到开发板1.拷贝2.…

开发中用到的设计模式

目录 开发中用到的设计模式 工厂模式 设计理念 好处 体现的编程思想 适配器模式 概念 策略模式和适配器模式的区别 选择策略模式而非适配器模式的原因 设计模式的开发原则 开发中用到的设计模式 在开发过程中,常见的设计模式会根据不同的业务场景和需求被…

1064 - You have an error in your SQL syntax;

在创建数据库表建立外键是遇到了如下报错 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near position(position_id) ) at line 8 数据库表sql如下: --职位表 CR…

无人机 ,遥控器与接收机之前的通信

目录 1、信号类型 2、工作频率 3、通信协议 3.1、PPM 协议 3.2、SBUS 协议 3.3、CRSF 协议 无人机的遥控器和接收机之间常用的信号、频率、协议等相关信息如下: 1、信号类型 模拟信号 特点:信号的幅度、频率或相位等参数是连续变化的&#xff0c…

【c++】四种类型转换形式

【c】四种类型转换形式 编译时: static_cast(静态转换) const_cast(去常性转换) reinterpret_cast(重新解释转换,直接转换地址) 运行时: dynamic_cast(动态转换,运行时类…

Cisco ASR1002查看资源占用的几条命令

查看平台资源 show platform resource 该命令用于显示整个平台的资源使用情况,包括 CPU、内存等 example: ASR1002# show platform resources **State Acronym: H - Healthy, W - Warning, C - Critical Resource…

Day 1:认知革命与DeepSeek生态定位

目标:建立对大模型技术范式的系统性认知,掌握DeepSeek的核心技术特性与生态价值 一、大模型技术演进:从GPT到DeepSeek 1.1 技术发展里程碑 2017-Transformer突破:Self-Attention机制如何突破RNN的序列建模瓶颈 2018-GPT初代&…

Python自动化办公之Excel拆分

在日常办公中,我们经常需要将包含多个Sheet页的Excel文件拆分成多个独立的Excel文件。例如,在发送Excel表给各部门确认时,出于控制知悉范围最小等保密性考虑,每个部门只需要查看和确认自己部门对应的Sheet页。手动拆分Excel文件非…

【CXX-Qt】1.1 Rust中的QObjects

本文涉及到了使用CXX-Qt将Rust、C和QML集成到Qt应用程序中的各个方面。下面,我将提供一个简单的示例,演示如何使用CXX-Qt来创建一个Rust结构体并将其作为QObject子类暴露给C和QML。 一、设置CXX-Qt环境 首先,确保您已经安装了Rust、CXX和CX…

Conda命令整理

Conda 是一个功能强大的包和环境管理工具,广泛用于 Python 开发中。除了基本的包和环境管理功能外,Conda 还提供了许多高级用法和技巧,帮助用户更高效地管理和维护 Python 环境。 1. 管理 Conda 本身 命令描述示例conda --version查看 Cond…

C++模拟实现AVL树

目录 1.文章概括 2.AVL树概念 3.AVL树的性质 4.AVL树的插入 5.旋转控制 1.左单旋 2. 右单旋 3.左右双旋 4.右左双旋 6.全部代码 1.文章概括 本文适合理解平衡二叉树的读者阅读,因为AVL树是平衡二叉树的一种优化,其大部分实现逻辑与平衡二叉树是…

opc da 服务器数据 转 EtherCAT项目案例

目录 1 案例说明 2 VFBOX网关工作原理 3 应用条件 4 查看OPC DA服务器的相关参数 5 配置网关采集opc da数据 6 启动EtherCAT从站转发采集的数据 7 在服务器上运行仰科OPC DA采集软件 8 案例总结 1 案例说明 在OPC DA服务器上运行OPC DA client软件查看OPC DA服务器的相…

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

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

StochSync:可在任意空间中生成360°全景图和3D网格纹理

StochSync方法可以用于在任意空间中生成图像,尤其是360全景图和3D网格纹理。该方法利用了预训练的图像扩散模型,以实现零-shot生成,消除了对新数据收集和单独训练生成模型的需求。StochSync 结合了 Diffusion Synchronization(DS&…

研发管理知识

定义 研发管理是对研发活动进行有效的计划、组织、领导和控制的过程,旨在通过合理配置资源、协调团队工作、监控项目进度和质量等,确保研发项目能够按时、按质、按量完成,实现企业的技术创新和产品升级目标,增强企业的核心竞争力。…