轮子项目--消息队列的实现(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,一经查实,立即删除!

相关文章

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

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

双周报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 { .…

百问网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.…

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&…

HarmonyOS 5.0应用开发——全局自定义弹出框openCustomDialog

【高心星出品】 文章目录 全局自定义弹出框openCustomDialog案例开发步骤完整代码 全局自定义弹出框openCustomDialog CustomDialog是自定义弹出框,可用于广告、中奖、警告、软件更新等与用户交互响应操作。开发者可以通过CustomDialogController类显示自定义弹出框…

DeepSeek模型R1服务器繁忙,怎么解决?

在当今科技飞速发展的时代,人工智能领域不断涌现出令人瞩目的创新成果,其中DeepSeek模型无疑成为了众多关注焦点。它凭借着先进的技术和卓越的性能,在行业内掀起了一股热潮,吸引了无数目光。然而,如同许多前沿技术在发…

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

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

[LLM面试题] 指示微调(Prompt-tuning)与 Prefix-tuning区别

一、提示调整(Prompt Tuning) Prompt Tuning是一种通过改变输入提示语(input prompt)以获得更优模型效果的技术。举个例子,如果我们想将一条英语句子翻译成德语,可以采用多种不同的方式向模型提问,如下图所示&#xf…

自主项目面试点总结

1、许苑–OJ判题系统 技术栈:Spring BootSpring Cloud AlibabaRedisMybatisMQDocker 项目地址: https://github.com/xuyuan-upward/xyoj-backend-microservice 1.1、项目介绍: 一个基于微服务的OJ系统,具备能够根据管理员预设的题目用例对用户提交的代…

【py】python安装教程(Windows系统,python3.13.2版本为例)

1.下载地址 官网:https://www.python.org/ 官网下载地址:https://www.python.org/downloads/ 2.64版本或者32位选择 【Stable Releases】:稳定发布版本,指的是已经测试过的版本,相对稳定。 【Pre-releases】&#…

CEF132 编译指南 MacOS 篇 - depot_tools 安装与配置 (四)

1. 引言 在 CEF132(Chromium Embedded Framework)的编译过程中,depot_tools 扮演着举足轻重的角色。这套由 Chromium 项目精心打造的脚本和工具集,专门用于获取、管理和更新 Chromium 及其相关项目(包括 CEF&#xff…

1312:【例3.4】昆虫繁殖

1312:【例3.4】昆虫繁殖 时间限制: 1000 ms 内存限制: 65536 KB 提交数:60386 通过数: 29787 【题目描述】 科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。每对成虫过xx个月产yy对卵,每对卵要过两个月长成成虫…

单片机上SPI和IIC的区别

SPI(Serial Peripheral Interface)和IC(Inter-Integrated Circuit)是两种常用的嵌入式外设通信协议,它们各有优缺点,适用于不同的场景。以下是它们的详细对比: — 1. 基本概念 SPI&#xff0…

SQL Server安装流程

SQL Server 2022在安全性、可用性和性能方面不断创新,是现在最支持Azure的SQL Server版本。 SQL Server发展史 SQL Server的历史始于1989年,当时是由微软与Sybase合作的产品,旨在为Windows NT操作系统提供一个高性能的数据库解决方案。随着…

从零开始认识大语言模型(LLM)

“AI小美好——聚焦科技、商业、职场。前沿资讯,实用干货,邂逅更美好的自己!” 在当今数字化时代,语言不仅是人类交流的工具,更是信息传递的核心。随着人工智能技术的飞速发展,大语言模型逐渐走进了我们的…

安装OpenJDK21(linux、macos)

文章目录 安装OpenJDK21java21linux下安装配置mac下安装 安装OpenJDK21 java21 封神!Java 21正式发布了,迎来了史诗级新特性,堪称版本最强!!! 视频链接:https://www.bilibili.com/video/BV1E8…

基于Java的自助多张图片合成拼接实战

目录 前言 一、图片合成需求描述 二、图片合成设计与实现 1、编程语言 2、基础数据准备 3、图片合成流程 4、图片合成实现 三、总结 前言 在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用。从社交媒体到电子商务,从在线教育到虚拟…