免费的黄冈网站有哪些平台能建商城
- 作者: 五速梦信息网
- 时间: 2026年04月20日 10:25
当前位置: 首页 > news >正文
免费的黄冈网站有哪些平台,能建商城,广州网站建设是什么,wordpress邀请码吧1. 数据库的选择 对于当前实现消息队列这样的一个中间件来说#xff0c;具体要使用哪个数据库#xff0c;是需要稍作考虑的#xff0c;如果直接使用 MySQL 数据库也是能实现正常的功能#xff0c;但是 MySQL 也是一个客户端服务器程序#xff0c;也就意味着如果想在其他服…1. 数据库的选择 对于当前实现消息队列这样的一个中间件来说具体要使用哪个数据库是需要稍作考虑的如果直接使用 MySQL 数据库也是能实现正常的功能但是 MySQL 也是一个客户端服务器程序也就意味着如果想在其他服务器上部署这个消息队列的项目还得需要安装 MySQL其实是不够轻量化的 此处为了使用更方便能将这里实现的消息队列单独使用简化配置环境于是采用的数据库是更轻量级的数据库SQLite。 SQLite 应用非常的广泛尤其是在一些性能不高的设备上使用数据库的首选一个完整的 SQLite 数据库只有一个单独的可执行文件体量特别小不到 1M我们甚至只需要在 maven 中引入相关依赖就可以使用 MyBatis 操作数据库了。 对比 MySQL 来说SQLite 只是一个本地的数据库并不是一个客户端服务器结构的程序而是相当于直接操作本地的硬盘文件。 在 pom.xml 中引入 SQLite dependencygroupIdorg.xerial/groupIdartifactIdsqlite-jdbc/artifactIdversion3.42.0.0/version /dependencyapplication.yml 中配置 SQLite 和 MyBatis 匹配路径 spring:datasource:url: jdbc:sqlite:./data/meta.dbusername:password:driver-class-name: org.sqlite.JDBCmybatis:mapper-locations: classpath:mapper/**Mapper.xmlmybatis 配置项的配置就不用说了这里主要是了解 datasource 配置项里面的 url这里的 url 就是 SQLite 把数据存储在当前硬盘的某个指定的文件中。 此处使用的是相对路径如果是在 IDEA 中直接运行程序此时的工作路径就是当前项目所在的路径如果是通过 java -jar 方式运行程序此时在哪个目录下执行的命令哪个目录就是工作目录。 而且此处的 username 和 password 是不需要声明的MySQL 是一个客户端服务器程序就可能会有很多个客户端去访问它而 SQLite 不是客户端服务器程序只有本地主机才能访问了(数据库存储在本地)。 虽然 MySQL 和 SQLite 不太一样但是它们同样可以使用 MyBatis 这样的框架来操作。 完整的 xml 依赖 dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion3.0.4/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter-test/artifactIdversion3.0.4/versionscopetest/scope/dependency!– https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc –dependencygroupIdorg.xerial/groupIdartifactIdsqlite-jdbc/artifactIdversion3.42.0.0/version/dependency/dependencies2. 要存储到数据库中的数据 其实对于要存储到数据库中的数据在思维导图中已经写出来了那为什么这些数据要放在数据库中存储换句话来说这些数据使用文件来存储不行吗 对于需要存储到数据库中的数据有 交换机队列绑定 为什么交换机与队列绑定不能使用文件存储呢其实也行只是在考虑效率问题方面和业务需求上的考虑最终使用数据库存储这里想象一下前面提到的 BrokerServer 需要提供的 API 中创建交换机创建队列创建绑定(根据交换机和队列是否持久化来判断绑定是否需要持久化)交换机和队列是可以选择是否持久化的如果选择了持久化才说明需要持久化对于持久化的队列和交换机来说也不需要反复的增删改查因为在内存中也会有一份这样的数据此时既然内存中有那为什么要走数据库查询呢其实本质上队列交换机绑定的持久化只需要在项目重新启动的时候把数据库中持久化的数据恢复到内存中就可以了。所以只有当 BrokerServer 启动时会恢复数据库的数据到内存中(查询数据库)再者只会在新增队列新增交换机新增绑定(插入记录)时可能会操作数据库其他时候都是操作在操作内存中的数据的。 所以这样一来选择数据库存储是完全够用的但是存储消息为何要使用文件不推荐使用数据库呢这里在后面讲到消息存储时会详细讲解。
- 设计实体类
这里需要先在 SpringBoot 启动类目录下创建一个 mqserver 目录这个目录用来放 BrokerServer 需要用到的代码接下来在 mqserver 目录下在创建一个 core 目录这里设计的实体类也就是放在 core 目录下。
3.1 Exchange 实体类 对于交换机主要由这属性组成 身份唯一标识String name 交换机的类型ExchangeType type 是否持久化boolean durable 是否自动删除boolean autoDelete 额外参数选项MapString , Object arguments 对于上述的自动删除和额外参数选项此项目就不再进行处理只是留有一个口子方便随时扩展。 对于这个交换机类型此处是单独提拎出一个枚举类来表示 package com.example.messagequeue.mqserver.core;public enum ExchangeType {DIRECT(0), // 直接交换机FANOUT(1), // 扇出交换机TOPIC(2); // 主题交换机private final int type;private ExchangeType(int type) {this.type type;}public int getType() {return type;} }对于 arguments 虽然不实现具体的功能但是还是为了避免后续扩展时能顺利的保存到数据库中此时就需要考虑数据库中如何存储一个 Map 数据库本身是没有 Map 这样的类型供我们使用的但是可以把 Map 转换成 json 字符串在查询的时候在把这个 json 字符串转换回 Map 就可以了。此处可以使用 ObjectMapper 这样的一个对象进行对 Java 的 json 字符串的序列化和反序列化。 既然这样的思路是可行的问题来到如何让 MyBatis 框架帮我们存的时候把对象转序列化成 json数据库中存 json 字符串取的时候把 json 字符串反序列化成 Java 对象呢 其实在 MyBatis 完成数据库操作的时候会自动调用到对象的 getter 和 setter 方法。 当 MyBatis 往数据库中写数据时就会调用对象的 getter 方法拿到属性的值再往数据库中写当 MyBatis 从数据库中读数据的时候就会调用对象的 setter 方法把数据库中读到的结果设置到对象的属性中。 了解了 MyBatis 会这样操作后我们只需要针对 arguments 参数的 gettersetter 方法做修改即可。 让 getter 方法返回一个 json 字符串让 setter 方法形参接收一个 json 字符串就可以了。于是 arguments 的 getter 和 setter 就可以写成这样 public String getArguments() {// 把当前的 arguments 转成 jsonObjectMapper objectMapper new ObjectMapper();try {return objectMapper.writeValueAsString(arguments);} catch (JsonProcessingException e) {e.printStackTrace();}return {}; }public void setArguments(String argumentsJson) {// 数据库读到的 json 转换成对象ObjectMapper objectMapper new ObjectMapper();try {this.arguments objectMapper.readValue(argumentsJson, new TypeReferenceHashMapString, Object() {});} catch (JsonProcessingException e) {e.printStackTrace();} }// 重载一下 arguments 的 getter 和 setter 方便后续使用 public Object getArguments(String key) {return arguments.get(key); } public void setArguments(MapString, Object arguments) {this.arguments arguments; } public void setArguments(String key, Object value) {this.arguments.put(key, value); }Exchange 完整代码 package com.example.messagequeue.mqserver.core;import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper;import java.util.HashMap; import java.util.Map;/*** 这个类表示交换机/ public class Exchange {// 身份标识(唯一)private String name;// 交换机类型, DIRECT, FANOUT, TOPICprivate ExchangeType type ExchangeType.DIRECT;//交换机是否要持久化存储private boolean durable false;// 没人使用时是否自动删除private boolean autoDelete false;// 创建交换机时指定的一些额外的参数选项private MapString , Object arguments new HashMap();public String getName() {return name;}public void setName(String name) {this.name name;}public ExchangeType getType() {return type;}public void setType(ExchangeType type) {this.type type;}public boolean isDurable() {return durable;}public void setDurable(boolean durable) {this.durable durable;}public boolean isAutoDelete() {return autoDelete;}public void setAutoDelete(boolean autoDelete) {this.autoDelete autoDelete;}public Object getArguments(String key) {return arguments.get(key);}public String getArguments() {// 把当前的 arguments 转成 jsonObjectMapper objectMapper new ObjectMapper();try {return objectMapper.writeValueAsString(arguments);} catch (JsonProcessingException e) {e.printStackTrace();}return {};}public void setArguments(String key, Object value) {this.arguments.put(key, value);}public void setArguments(String argumentsJson) {// 数据库读到的 json 转换成对象ObjectMapper objectMapper new ObjectMapper();try {this.arguments objectMapper.readValue(argumentsJson,new TypeReferenceHashMapString, Object() {});} catch (JsonProcessingException e) {e.printStackTrace();}}public void setArguments(MapString, Object arguments) {this.arguments arguments;} }ExchangeType 类完整代码 package com.example.messagequeue.mqserver.core;public enum ExchangeType {DIRECT(0),FANOUT(1),TOPIC(2);private final int type;private ExchangeType(int type) {this.type type;}public int getType() {return type;} }3.2 MsgQueue 实体类 对于队列目前主要由这属性组成 队列唯一标识String name 是否持久化boolean durable 是否只能被一个消费者使用boolean exclusive 自动删除boolean autoDelete 扩展参数MapString, Object arguments 这里自动删除和扩展参数也是本项目中留有扩展接口暂不实现而 exclusive 参数是否独有则留到彩蛋部分。 MsgQueue 这里也没什么好说的主要也是 arguments 这个参数的 getter 和 setter 需要注意一下。 MsgQueue 完整代码 package com.example.messagequeue.mqserver.core;import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper;import java.util.HashMap; import java.util.Map;/** 这个类表示存储消息的队列/ public class MsgQueue {// 队列的身份标识private String name;// 队列是否持久化private boolean durable false;// 如果为 true 表示这个队列只能被一个消费者使用 nprivate boolean exclusive false;// 自动删除 nprivate boolean autoDelete false;// 扩展参数 nprivate MapString, Object arguments new HashMap();public String getName() {return name;}public void setName(String name) {this.name name;}public boolean isDurable() {return durable;}public void setDurable(boolean durable) {this.durable durable;}public boolean isExclusive() {return exclusive;}public void setExclusive(boolean exclusive) {this.exclusive exclusive;}public boolean isAutoDelete() {return autoDelete;}public void setAutoDelete(boolean autoDelete) {this.autoDelete autoDelete;}public Object getArguments(String key) {return arguments.get(key);}public String getArguments() {// 把当前的 arguments 转成 jsonObjectMapper objectMapper new ObjectMapper();try {return objectMapper.writeValueAsString(arguments);} catch (JsonProcessingException e) {e.printStackTrace();}return {};}public void setArguments(String key, Object value) {this.arguments.put(key, value);}public void setArguments(String argumentsJson) {// 数据库读到的 json 转换成对象ObjectMapper objectMapper new ObjectMapper();try {this.arguments objectMapper.readValue(argumentsJson, new TypeReferenceHashMapString, Object() {});} catch (JsonProcessingException e) {e.printStackTrace();}}public void setArguments(MapString, Object arguments) {this.arguments arguments;} }当然上述代码其实还并不是最终代码随着项目往后写代码根据需求的到来也要需要进行一定的扩展。 3.3 Binding 实体类 对于绑定目前主要由这属性组成 绑定的交换机名String exchangeName 绑定的队列名String queueName 绑定的匹配KeyString bindingKey 绑定实体类比较简单bindingKey 的作用在前面章节也提到过这里就不多介绍了Binding 没有主键的原因是要依赖于 exchangeName 和 queueName 这两个维度来进行筛选实体类主要是映射数据库中的数据所以其实并不复杂不涉及到业务所以也就不做赘述。 Binding 完整代码 package com.example.messagequeue.mqserver.core;/** 表示队列和交换机之间的关联关系*/ public class Binding {private String exchangeName;private String queueName;// 题目private String bindingKey;public String getExchangeName() {return exchangeName;}public void setExchangeName(String exchangeName) {this.exchangeName exchangeName;}public String getQueueName() {return queueName;}public void setQueueName(String queueName) {this.queueName queueName;}public String getBindingKey() {return bindingKey;}public void setBindingKey(String bindingKey) {this.bindingKey bindingKey;} }4. 建表操作 实体类写好了剩下的就是创建数据库了对于之前的 MySQL 来说创建一个表需要先创建一个库create databases …然后在 create table …然后把写好的 SQL 放在一个 db.sql 中然后把这个 .sql 文件或者把这个文件的内容放在 MySQL 复制粘贴一执行就行了。之前这样做确实没问题因为这样的项目大概部署一次就够了不会反复操作但是这里实现的消息队列可能会设计到多次部署比如多个服务器都想部署。 这里有没有一种方法通过代码来自动的完成建库建表的操作呢 其实 MyBatis 就能做到只是之前 xml 来实现数据库的增删改查对应的就是不同的 xml 标签对于 create table 这样的语句有对应的标签提供吗 没有但是可以使用 update 标签来代替update 标签中也可以写 create 语句把每个建表的语句都使用一个 update 标签并对应一个 Java 方法。能否在一个 update 标签中一次性创建多张表呢是不行的当一个 update 标签写了多个 create table 的时候只有第一个语句能执行。所以这里只能采取一个 Java 方法对应一个 xml 的建表的标签。 看到这可能有个疑问库呢只提到建表难道不用建立 databases 吗前面在 yml 中配置的 spring:datasource:url: jdbc:sqlite:./data/meta.dbusername:password:driver-class-name: org.sqlite.JDBCmeta.db 这个文件本质上就是此项目用到的库咱们在代码中只需要写创建表的语句就可以了。 现在就按照上述说的来做 在 mqserver 目录下建立 mapper 目录这里面放着一个接口为 MetaMapper.java对应的 resources 目录下的 mapper 目录里面的 MetaMapper.xml 就是对应上述 MetaMapper.java 接口里面方法的实现。这个很基本的 MyBatis 操作了也就不再赘述。 基本标签 ?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.example.messagequeue.mqserver.mapper.MetaMapper/mapper先是建表操作对于这个数据库来说应该有三张表分别是 exchangequeuebinding。 void createExchangeTable(); void createQueueTable(); void createBindingTable();update idcreateExchangeTablecreate table if not exists exchange (name varchar(50) primary key,type int,durable boolean,autoDelete boolean,arguments varchar(1024)) /updateupdate idcreateQueueTablecreate table if not exists queue (name varchar(50) primary key,durable boolean,exclusive boolean,autoDelete boolean,arguments varchar(1024)) /updateupdate idcreateBindingTablecreate table if not exists binding (exchangeName varchar(50),queueName varchar(50),bindingKey varchar(256)) /update5. 数据操作 接下来是增删改查但是此项目不提供修改其实也不太会去修改。 接下来就应该实现如下的 SQL 操作了 插入一个交换机查找所有的交换机删除一个交换机 插入一个队列查找所有的队列删除一个队列 插入一个绑定查找所有的绑定删除一个绑定 为什么不设计一个方法根据交换机名或者队列名查找交换机和队列呢设置设计一个方法根据交换机名队列名查找绑定呢 前文提到过由于这里对于 ExchangeQueueBinding 的持久化就是为了在项目启动的时候将这些数据库硬盘上的数据恢复到内存中项目运行起来了启动了后那个时候的查找其实就是去内存中查找了正如思维导图所述对于 ExchangeQueueBinding在内存中也会持有一份而硬盘中是否持有取决于客户端的选择了。 ListExchange selectAllExchanges();void deleteExchange(String exchangeName);void insertQueue(MsgQueue msgQueue);ListMsgQueue selectAllQueues();void deleteQueue(String queueName);void insertBinding(Binding binding);ListBinding selectAllBindings();void deleteBinding(Binding binding);insert idinsertExchange parameterTypecom.example.messagequeue.mqserver.core.Exchangeinsert into exchange values (#{name}, #{type}, #{durable}, #{autoDelete}, #{arguments}) /insertselect idselectAllExchanges resultTypecom.example.messagequeue.mqserver.core.Exchangeselect * from exchange /selectinsert idinsertQueue parameterTypecom.example.messagequeue.mqserver.core.MsgQueueinsert into queue values(#{name}, #{durable}, #{exclusive}, #{autoDelete}, #{arguments}) /insertselect idselectAllQueues resultTypecom.example.messagequeue.mqserver.core.MsgQueueselect * from queue /selectinsert idinsertBinding parameterTypecom.example.messagequeue.mqserver.core.Bindinginsert into binding values(#{exchangeName}, #{queueName}, #{bindingKey}) /insertselect idselectAllBindings resultTypecom.example.messagequeue.mqserver.core.Bindingselect * from binding /selectdelete iddeleteExchange parameterTypejava.lang.Stringdelete from exchange where name #{exchangeName} /deletedelete iddeleteQueue parameterTypejava.lang.Stringdelete from queue where name #{queueName} /deletedelete iddeleteBinding parameterTypecom.example.messagequeue.mqserver.core.Bindingdelete from binding where exchangeName #{exchangeName} and queueName #{queueName} /delete完整代码如下 MetaMapper.java 完整代码 package com.example.messagequeue.mqserver.mapper;import com.example.messagequeue.mqserver.core.Binding; import com.example.messagequeue.mqserver.core.Exchange; import com.example.messagequeue.mqserver.core.MsgQueue; import org.apache.ibatis.annotations.Mapper;import java.util.List;/*** 源属性*/ Mapper public interface MetaMapper {// 建表方法void createExchangeTable();void createQueueTable();void createBindingTable();// 插入删除查找操作void insertExchange(Exchange exchange);ListExchange selectAllExchanges();void deleteExchange(String exchangeName);void insertQueue(MsgQueue msgQueue);ListMsgQueue selectAllQueues();void deleteQueue(String queueName);void insertBinding(Binding binding);ListBinding selectAllBindings();void deleteBinding(Binding binding); }MetaMapper.xml 完整代码 ?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.example.messagequeue.mqserver.mapper.MetaMapperupdate idcreateExchangeTablecreate table if not exists exchange (name varchar(50) primary key,type int,durable boolean,autoDelete boolean,arguments varchar(1024))/updateupdate idcreateQueueTablecreate table if not exists queue (name varchar(50) primary key,durable boolean,exclusive boolean,autoDelete boolean,arguments varchar(1024))/updateupdate idcreateBindingTablecreate table if not exists binding (exchangeName varchar(50),queueName varchar(50),bindingKey varchar(256))/updateinsert idinsertExchange parameterTypecom.example.messagequeue.mqserver.core.Exchangeinsert into exchange values (#{name}, #{type}, #{durable}, #{autoDelete}, #{arguments})/insertselect idselectAllExchanges resultTypecom.example.messagequeue.mqserver.core.Exchangeselect * from exchange/selectinsert idinsertQueue parameterTypecom.example.messagequeue.mqserver.core.MsgQueueinsert into queue values(#{name}, #{durable}, #{exclusive}, #{autoDelete}, #{arguments})/insertselect idselectAllQueues resultTypecom.example.messagequeue.mqserver.core.MsgQueueselect * from queue/selectinsert idinsertBinding parameterTypecom.example.messagequeue.mqserver.core.Bindinginsert into binding values(#{exchangeName}, #{queueName}, #{bindingKey})/insertselect idselectAllBindings resultTypecom.example.messagequeue.mqserver.core.Bindingselect * from binding/selectdelete iddeleteExchange parameterTypejava.lang.Stringdelete from exchange where name #{exchangeName}/deletedelete iddeleteQueue parameterTypejava.lang.Stringdelete from queue where name #{queueName}/deletedelete iddeleteBinding parameterTypecom.example.messagequeue.mqserver.core.Bindingdelete from binding where exchangeName #{exchangeName} and queueName #{queueName}/delete/mapper6. 整合数据库操作 这一小节的操作就是将上述的建表以及数据的操作整合到一个类中(DataBaseManager)后续直接使用这个类去操作数据库。 对于第一个就是先需要初始化也就是先建立三张需要的表和一些基本数据初始化数据库就在 DataBaseManager 中写一个 init() 方法用于初始化数据库。 要想操作数据库也就是调用前面创建的 MetaMapper 里面的方法这里由于是 SpringBoot 的项目这里需要手动拿到 metaMapper可以使用注解等等但这里采取使用 Spring 应用上下文 ApplicationContext 当中获取 metaMapper 对象就可以了。只需要将启动类修改成如下 package com.example.messagequeue;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext;SpringBootApplication public class MessageQueueApplication {public static ConfigurableApplicationContext context;public static void main(String[] args) {context SpringApplication.run(MessageQueueApplication.class, args);}}后续通过 MessageQueueApplication.context 也是可以获取到想要的 Bean 实例。 6.1 初始化数据库 public class DataBaseManager {// 手动拿到 metaMapperprivate MetaMapper metaMapper;// 数据库初始化public void init() {// 获取到 MetaMappermetaMapper MyMessageQueueApplication.context.getBean(MetaMapper.class);if (!checkDBExists()) {File dataDir new File(./data);dataDir.mkdirs();createTable();createDefaultData();System.out.println([DataBaseManager] 初始化完成!);} else {System.out.println([DataBaseManager] 数据库已经存在!);}}private boolean checkDBExists() {File file new File(./data/meta.db);return file.exists();}private void createTable() {// 不需要手动创建 meta.db// 首次执行这里的数据库操作时, 就会自动创建出 meta.db 文件 (mybatis 完成的)metaMapper.createExchangeTable();metaMapper.createQueueTable();metaMapper.createBindingTable();System.out.println([DataBaseManager] 创建表完成!);}private void createDefaultData() {// 添加一个默认的交换机// RabbitMQ 设定, 有一个匿名的交换机, 类型是 DIRECT.Exchange exchange new Exchange();exchange.setName();exchange.setType(ExchangeType.DIRECT);exchange.setDurable(true);exchange.setAutoDelete(false);metaMapper.insertExchange(exchange);System.out.println([DataBaseManager] 创建初始数据完成!);} }6.2 封装操作数据的方法 // 提供方便单元测试时收尾工作要删除数据库的方法 public void deleteDB() {File file new File(./data/meta.db);boolean ret file.delete();if (ret) {System.out.println([DataBaseManager] 删除数据库文件成功!);} else {System.out.println([DataBaseManager] 删除数据库文件失败!);}File dataDir new File(./data);ret dataDir.delete();if (ret) {System.out.println([DataBaseManager] 删除数据库目录成功!);} else {System.out.println([DataBaseManager] 删除数据库目录失败!);} }public void insertExchange(Exchange exchange) {metaMapper.insertExchange(exchange); }public ListExchange selectAllExchanges() {return metaMapper.selectAllExchanges(); }public void deleteExchange(String exchangeName) {metaMapper.deleteExchange(exchangeName); }public void insertQueue(MsgQueue msgQueue) {metaMapper.insertQueue(msgQueue); }public ListMsgQueue selectAllQueues() {return metaMapper.selectAllQueues(); }public void deleteQueue(String queueName) {metaMapper.deleteQueue(queueName); }public void insertBinding(Binding binding) {metaMapper.insertBinding(binding); }public ListBinding selectAllBindings() {return metaMapper.selectAllBindings(); }public void deleteBinding(Binding binding) {metaMapper.deleteBinding(binding); }上述封装操作数据库的方法很简单本质就是调用了下 metaMapper 里面的方法。 6.3 单元测试 这里详细的单元测试就不写了相信写过 Spring 项目的都会进行单元测试那么此处只给出一个标准测试 DataBaseManager 类的架子就行了按照其中的一个测试方法接着往下写新的测试用例就OK了。 package com.example.messagequeue;import com.example.messagequeue.mqserver.core.Binding; import com.example.messagequeue.mqserver.core.Exchange; import com.example.messagequeue.mqserver.core.ExchangeType; import com.example.messagequeue.mqserver.core.MsgQueue; import com.example.messagequeue.mqserver.datacenter.DataBaseManager; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.boot.SpringApplication; import org.springframework.boot.test.context.SpringBootTest;import java.util.List;SpringBootTest public class DataBaseManagerTests {private DataBaseManager dataBaseManager new DataBaseManager();/*** 准备工作/BeforeEachprivate void setUp() {MessageQueueApplication.context SpringApplication.run(MessageQueueApplication.class);dataBaseManager.init();}/** 收尾工作*/AfterEachprivate void tearDown() {// 删除数据库// 为什么要先关闭 context 对象呢// 此处的 context 对象持有了 MetaMapper 的示例, MataMapper 实例又打开了 meta.db 数据库文件// 另一方面, 获取 context 操作, 会占用 8080 端口MessageQueueApplication.context.close();dataBaseManager.deleteDB();}Testpublic void testInitTable() {// 由于 init 方法在上面 setUp中调用过了, 在下面代码直接检查数据库状态即可// 查交换机表, 里面应该有一个数据ListExchange exchangeList dataBaseManager.selectAllExchanges();ListMsgQueue msgQueueList dataBaseManager.selectAllQueues();ListBinding bindingList dataBaseManager.selectAllBindings();Assertions.assertEquals(1, exchangeList.size());Assertions.assertEquals(, exchangeList.get(0).getName());Assertions.assertEquals(ExchangeType.DIRECT, exchangeList.get(0).getType());Assertions.assertEquals(0, msgQueueList.size());Assertions.assertEquals(0, bindingList.size());}private Exchange createTestExchange(String exchangeName) {Exchange exchange new Exchange();exchange.setName(exchangeName);exchange.setType(ExchangeType.FANOUT);exchange.setAutoDelete(false);exchange.setDurable(true);exchange.setArguments(aaa, 1);exchange.setArguments(bbb, 2);return exchange;}Testpublic void testInsertExchange() {Exchange exchange createTestExchange(testExchange);dataBaseManager.insertExchange(exchange);ListExchange exchangeList dataBaseManager.selectAllExchanges();Assertions.assertEquals(2, exchangeList.size());Exchange newExchange exchangeList.get(1);Assertions.assertEquals(testExchange, newExchange.getName());Assertions.assertEquals(ExchangeType.FANOUT, newExchange.getType());Assertions.assertEquals(false, newExchange.isAutoDelete());Assertions.assertEquals(true, newExchange.isDurable());Assertions.assertEquals(1, newExchange.getArguments(aaa));Assertions.assertEquals(2, newExchange.getArguments(bbb));}// ……
- 上一篇: 免费的发帖收录网站企业安全文化建设
- 下一篇: 免费的静态网站托管项目外包和人力外包哪个好
相关文章
-
免费的发帖收录网站企业安全文化建设
免费的发帖收录网站企业安全文化建设
- 技术栈
- 2026年04月20日
-
免费的代理服务器深圳网站自然优化
免费的代理服务器深圳网站自然优化
- 技术栈
- 2026年04月20日
-
免费的ps软件遂宁网站seo
免费的ps软件遂宁网站seo
- 技术栈
- 2026年04月20日
-
免费的静态网站托管项目外包和人力外包哪个好
免费的静态网站托管项目外包和人力外包哪个好
- 技术栈
- 2026年04月20日
-
免费的手机网站模板分析苏宁易购网站内容建设
免费的手机网站模板分析苏宁易购网站内容建设
- 技术栈
- 2026年04月20日
-
免费的素材网站推荐wordpress目录排序
免费的素材网站推荐wordpress目录排序
- 技术栈
- 2026年04月20日
