【消息队列开发】 实现DataBaseManager类

简介: 【消息队列开发】 实现DataBaseManager类

🍃前言

通过这个类, 来整合前面的数据库操作.

🌴手动获取MetaMapper对象

我们知道 MetaMapper 对象我们使用注解交给了spring进行管理,一般来说我们只要使用@Autowired来进行依赖注入就好

但是呢,使用@Autowired的条件是当前类也需要交给spring进行管理。

但是这里我们并不想将DataBaseManager交给spring管理,我们希望实现手动管理。

这时候就需要我们进行手动获取对象了,做法如下:

我们在MqApplication启动类里添加一个全局变量context,属于ConfigurableApplicationContext类,用于获取上下文

并在main方法进行赋值

然后我们使用MqApplication.context.getBean(MetaMapper.class);便可以拿到MetaMapper对象了

🎋针对数据库进行初始化与删除

🚩数据库的初始化

在这个DataBaseManager类里,我希望做到以下几点

  1. 如果数据库不存在,则进行创库创表的操作
  1. 首先进行一个建库操作,创建一个.data目录
  2. 创建相应的表格
  3. 我们在给这些表插入一些默认的数据
  1. 如果数据表存在,则啥也不干

🚩数据库的删除

数据库的删除我们分为两步

  1. 先删除meta.dp文件
  2. 再删除./data目录

如此才叫删除干净

🚩代码实现

// 要做的是从 Spring 中拿到现成的对象
private MetaMapper metaMapper;
// 针对数据库进行初始化
public void init() {
    // 手动的获取到 MetaMapper
    metaMapper = MqApplication.context.getBean(MetaMapper.class);
    if (!checkDBExists()) {
        // 数据库不存在, 就进行建建库表操作
        // 先创建一个 data 目录
        File dataDir = new File("./data");
        dataDir.mkdirs();
        // 创建数据表
        createTable();
        // 插入默认数据
        createDefaultData();
        System.out.println("[DataBaseManager] 数据库初始化完成!");
    } else {
        // 数据库已经存在了, 啥都不必做即可
        System.out.println("[DataBaseManager] 数据库已经存在!");
    }
}
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");
    // 使用 delete 删除目录的时候, 需要保证目录是空的.
    ret = dataDir.delete();
    if (ret) {
        System.out.println("[DataBaseManager] 删除数据库目录成功!");
    } else {
        System.out.println("[DataBaseManager] 删除数据库目录失败!");
    }
}
private boolean checkDBExists() {
    File file = new File("./data/meta.db");
    if (file.exists()) {
        return true;
    }
    return false;
}
// 这个方法用来建表.
// 建库操作并不需要手动执行. (不需要手动创建 meta.db 文件)
// 首次执行这里的数据库操作的时候, 就会自动的创建出 meta.db 文件来 (MyBatis 帮我们完成的)
private void createTable() {
    metaMapper.createExchangeTable();
    metaMapper.createQueueTable();
    metaMapper.createBindingTable();
    System.out.println("[DataBaseManager] 创建表完成!");
}
// 给数据库表中, 添加默认的数据.
// 此处主要是添加一个默认的交换机.
// RabbitMQ 里有一个这样的设定: 带有一个 匿名 的交换机, 类型是 DIRECT.
private void createDefaultData() {
    // 构造一个默认的交换机.
    Exchange exchange = new Exchange();
    exchange.setName("");
    exchange.setType(ExchangeType.DIRECT);
    exchange.setDurable(true);
    exchange.setAutoDelete(false);
    metaMapper.insertExchange(exchange);
    System.out.println("[DataBaseManager] 创建初始数据完成!");
}

🌲封装其他操作

除此之外我们希望对其他的增加、删除、查看操作也在该类进行封装一下

代码实现如下:

// 把其他的数据库的操作, 也在这个类中封装一下.
public void insertExchange(Exchange exchange) {
    metaMapper.insertExchange(exchange);
}
public List<Exchange> selectAllExchanges() {
    return metaMapper.selectAllExchanges();
}
public void deleteExchange(String exchangeName) {
    metaMapper.deleteExchange(exchangeName);
}
public void insertQueue(MSGQueue queue) {
    metaMapper.insertQueue(queue);
}
public List<MSGQueue> selectAllQueues() {
    return metaMapper.selectAllQueues();
}
public void deleteQueue(String queueName) {
    metaMapper.deleteQueue(queueName);
}
public void insertBinding(Binding binding) {
    metaMapper.insertBinding(binding);
}
public List<Binding> selectAllBindings() {
    return metaMapper.selectAllBindings();
}
public void deleteBinding(Binding binding) {
    metaMapper.deleteBinding(binding);
}

⭕总结

关于《【消息队列开发】 实现DataBaseManager类》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

相关文章
|
28天前
|
消息中间件 Java 数据库
【消息队列开发】 实现 VirtualHostTests 类——测试虚拟主机操作
【消息队列开发】 实现 VirtualHostTests 类——测试虚拟主机操作
|
28天前
|
消息中间件 存储 安全
【消息队列开发】 实现ConsumerManager类——消费消息的核心逻辑
【消息队列开发】 实现ConsumerManager类——消费消息的核心逻辑
|
28天前
|
消息中间件 网络协议 Java
【消息队列开发】 实现BrokerServer类——本体服务器
【消息队列开发】 实现BrokerServer类——本体服务器
|
1天前
|
消息中间件 Java 开发工具
消息队列 MQ产品使用合集之topic相同,但是tag不同,这个类不能放入map中,该如何处理
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
28天前
|
消息中间件 Java
【消息队列开发】 实现消费者订阅消息
【消息队列开发】 实现消费者订阅消息
|
7天前
|
消息中间件 Java Spring
JavaWeb后端开发Spring框架之消息 消息队列案例--订单短信通知
JavaWeb后端开发Spring框架之消息 消息队列案例--订单短信通知
13 0
|
28天前
|
消息中间件 API
【消息队列开发】 实现 MqClientTests 类——测试客户端
【消息队列开发】 实现 MqClientTests 类——测试客户端
|
28天前
|
消息中间件 存储 网络协议
【消息队列开发】实现客户端
【消息队列开发】实现客户端
|
28天前
|
消息中间件 网络协议
【消息队列开发】 设计网络通信协议
【消息队列开发】 设计网络通信协议
|
1天前
|
消息中间件 网络协议 JavaScript
消息队列 MQ产品使用合集之报错提示是"the internal error!",是什么原因导致的”
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。