消息队列项目(2)

news2024/9/25 17:19:54

我们使用 SQLite 来进行对 Exchange, Queue, Binding 的硬盘保存

对 Message 就保存在硬盘的文本中

SQLite 封装

这里是在 application.yaml 中来引进对 SQLite 的封装

spring:
  datasource:
    url: jdbc:sqlite:./data/meta.db
    username:
    password:
    driver-class-name: org.sqlite.JDBC


mybatis:
  mapper-locations: classpath:mapper/**Mapper.xml

先进行建表操作: 

 使用一个接口类和对应的 xml 就可以进行对数据库的操作

然后对增删查进行封装

完整代码:

SQliteMapper:

package com.example.mq.mqserver.mapper;

import com.example.mq.mqserver.core.Binding;
import com.example.mq.mqserver.core.Exchange;
import com.example.mq.mqserver.core.MSGQueue;

import java.util.List;

@Mapper //数据持久层
public interface SQLiteMapper {
    // 建表
    void createExchangeTable();
    void createQueueTable();
    void createBindingTable();

    // 增删查
    int insertExchange(Exchange exchange);
    int deleteExchange(String exchangeName);
    List<Exchange> selectAllExchange();

    int insertQueue(MSGQueue queue);
    int deleteQueue(String queueName);
    List<MSGQueue> selectAllQueue();

    int insertBinding(Binding binding);
    int deleteBinding(Binding binding);
    List<Binding> selectAllBinding();
}

SQLiteMapper.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mq.mqserver.mapper.SQLiteMapper">
    <update id="createExchangeTable">
        create table if not exists exchange (name varchar(50) primary key, durable boolean, type int);
    </update>

    <update id="createQueueTable">
        create table if not exists queue(name varchar(50) primary key, durable boolean);
    </update>

    <update id="createBindingTable">
        create table if not exists binding(exchangename varchar(50), queuename varchar(50), durable boolean, bindingkey varchar(50));
    </update>

    <insert id="insertExchange">
        insert into exchange values(#{name}, #{durable}, #{type});
    </insert>

    <delete id="deleteExchange">
        delete from exchange where name = #{exchangeName};
    </delete>
    
    <select id="selectAllExchange" resultType="com.example.mq.mqserver.core.Exchange">
        select * from exchange;
    </select>
    
    <insert id="insertQueue">
        insert into queue values(#{name}, #{durable}); 
    </insert>
    
    <delete id="deleteQueue">
        delete form queue where name = #{queueName};
    </delete>
    
    <select id="selectAllQueue" resultType="com.example.mq.mqserver.core.MSGQueue">
        select * from queue;
    </select>
    
    <insert id="insertBinding">
        insert into binding values(#{exchangeName}, #{queueName}, #{durable}, #{bindingKey});
    </insert>
    
    <delete id="deleteBinding">
        delete from binding where exchangename = #{exchangeName} and queueName = #{queueName};
    </delete>
    
    <select id="selectAllBinding" resultType="com.example.mq.mqserver.core.Binding">
        select * from binding;
    </select>

    
</mapper>

然后我们创建一个类来对整合上述的数据库操作

先在 mqserver 中创建一个 datacenter 包, 这个包用来进行所有数据的管理

然后在包里创建一个 DataBaseManager 的类进行数据库操作的整合

DataBaseManager

checkDBExists() 查找数据库是不是存在

createTable() 之前构造好的方法

    public boolean checkDBExists(){
        File file = new File("./data/meta.db");
        if(file.exists()){
            return true;
        }
        return false;
    }

    private void createTable(){
        sqLiteMapper.createExchangeTable();
        sqLiteMapper.createQueueTable();
        sqLiteMapper.createBindingTable();
    }

init() 对数据库进行初始化

// 针对数据库进行初始化
    // 有 data 文件夹的话就不用创建
    // 没有就进行创建
    public void init(){
        if(!checkDBExists()){
            // 创建文件夹
            File dataDir = new File("./data");
            dataDir.mkdirs();
            // 创建数据表
            createTable();
            System.out.println("[DataBaseManager] 数据库初始化完成");
        }else {
            System.out.println("[DatBaseManager] 数据库已经存在");
        }

    }

然后是增删查:

这里把整个类全部放上来

public class DataBaseManager {
    @Autowired
    SQLiteMapper sqLiteMapper;

    // 针对数据库进行初始化
    // 有 data 文件夹的话就不用创建
    // 没有就进行创建
    public void init(){
        if(!checkDBExists()){
            // 创建文件夹
            File dataDir = new File("./data");
            dataDir.mkdirs();
            // 创建数据表
            createTable();
            System.out.println("[DataBaseManager] 数据库初始化完成");
        }else {
            System.out.println("[DatBaseManager] 数据库已经存在");
        }

    }

    public boolean checkDBExists(){
        File file = new File("./data/meta.db");
        if(file.exists()){
            return true;
        }
        return false;
    }

    private void createTable(){
        sqLiteMapper.createExchangeTable();
        sqLiteMapper.createQueueTable();
        sqLiteMapper.createBindingTable();
    }

    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 int insertExchange(Exchange exchange){
        return sqLiteMapper.insertExchange(exchange);
    }

    public int deleteExchange(String stingName){
        return sqLiteMapper.deleteExchange(stingName);
    }

    public List<Exchange> selectAllExchanges(){
        return sqLiteMapper.selectAllExchange();
    }

    // 队列操作
    public int insertQueue(MSGQueue queue){
        return sqLiteMapper.insertQueue(queue);
    }

    public int deleteQueue(String queueName){
        return sqLiteMapper.deleteQueue(queueName);
    }

    public List<MSGQueue> selectAllQueue(){
        return sqLiteMapper.selectAllQueue();
    }

    // 队列操作
    public int insertBinding(Binding binding){
        return sqLiteMapper.insertBinding(binding);
    }

    public int deleteBinding(Binding binding){
        return sqLiteMapper.deleteBinding(binding);
    }

    public List<Binding> selectAllBinding(){
        return sqLiteMapper.selectAllBinding();
    }

}

  

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

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

相关文章

MySQL索引3——Explain关键字和索引优化(SQL提示、索引失效、索引使用规则)

目录 Explain关键字 索引性能分析 Id ——select的查询序列号 Select_type——select查询的类型 Table——表名称 Type——select的连接类型 Possible_key ——显示可能应用在这张表的索引 Key——实际用到的索引 Key_len——实际索引使用到的字节数 Ref ——索引命…

安捷伦54642D混合信号示波器

安捷伦54642D混合信号示波器 附加功能: 带宽:500兆赫&#xff08;131---4587---6435&#xff09; 通道:2个模拟和16个数字 采样速率:2Gs/s 记录长度:8分钟 获得专利的高清显示系统 灵活触发&#xff0c;包括CAN、I2C、LIN、SPI和USB 接口总线上的深层存储器传输 强大、灵活的触…

嵌入式笔试面试刷题(day5 IIC详解)

文章目录 前言一、IIC需要几根线分别是什么线二、IIC优势三、IIC可以挂载多少个从设备&#xff0c;主设备1.从设备数量2.主设备数量 四、IIC是全双工还是半双工五、SDA和SCL为什么配置为上拉开漏输出模式1.为什么要配置为开漏输出不能是推挽输出a.实现线与功能b.保护设备不会被…

XXL-JOB执行器集群及分片功能

系统架构图 XXL-JOB职责划分 准备工作 1.下载代码 https://gitee.com/xuxueli0323/xxl-job/tree/2.3.0/ 2.将xxl-job sql执行 3.修改xxl-job-admin数据库链接及账号密码 4.创建日志目录修改日志文件指定输出目录 5.启动项目后访问xxl-job-admin http://localhost:8080/xxl-…

GD32F103*固件库移植μCOS-Ⅲ详细教程与解析(最终版本已上传,可下载)

GD32F103*固件库移植μCOS-Ⅲ详细教程与解析&#xff08;最终版本已上传&#xff0c;可下载&#xff09; GD32F103*移植μCOS-Ⅲ详细教程与解析&#xff0c;欢迎指正 文章目录 GD32F103*固件库移植μCOS-Ⅲ详细教程与解析&#xff08;最终版本已上传&#xff0c;可下载&#x…

GitHub上删除项目后,IDEA分享项目到GitHub提示Remote is already on GitHub

文章目录 一、错误信息二、解决方法1.删除GitHub上的项目2.找到项目里的.git隐藏文件3.找到config文件4.打开config文件&#xff0c;删除[remote "git-test"]及下面两行内容5.继续使用IDEA分享项目到GitHub即可 一、错误信息 二、解决方法 1.删除GitHub上的项目 2.…

亿邦智库天猫:2023年中国家电产业带白皮书(附下载)

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 中国家电产业市场始于上个世纪80年代&#xff0c;经过近四十年的发展&#xff0c;中国家电产业经历了以产能为主导的“供给驱动〞 阶段、线下网点为主导的“溪道驱动”阶段&#xff0c;现已全面进入以…

Windows批处理基础

一、【echo】显示文本内容 echo | Microsoft Learnhttps://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/echo 显示消息或者打开或关闭命令回显功能。 如果不结合任何参数使用&#xff0c;echo 会显示当前回显设置。 1.1、echo显示文本常用命…

【GEMM预备工作】行主序和列主序矩阵的内存中的连续性,解决理解问题

在内存存储中&#xff0c;默认矩阵是按照行优先储存的&#xff0c;即矩阵的每一列在内存中是连续的。行优先矩阵储存中行数据是不连续的。 而对于列主序的矩阵&#xff0c;是按照列优先储存的&#xff0c;即矩阵的每一行在内存中是连续的。列优先矩阵储存中列数据是不连续的&am…

过滤器的使用和编码过滤器案例

过滤器的使用和编码过滤器案例 案例&#xff1a;设置UTF-8编码

Python - 【socket】 服务端Server异常重启处理简单示例Demo(二)

一. 前言 当socket服务端通信出现异常时&#xff0c;我们需要做重启程序&#xff0c;可根据具体场景做出选择 二. 示例代码 1. 重启服务 import socket import time import sys import tracebackHOST 127.0.0.1 # 服务器IP地址 PORT 8080 # 服务器端口号 BACKLOG 5 #…

七步成诗问题处理法

七步成诗问题处理法 来自麦肯锡咨询公司的经典工具&#xff0c;是各类问题处理的一种方法和逻辑&#xff0c;广泛应用于现代企业管理中&#xff0c;也适用于个人的问题处理。 模型介绍 职场中最重要的能力之一&#xff0c;一定是解决问题的能力。善于解决问题&#xff0c;通常…

台灯应该买什么样的才能护眼?教大家如何挑选护眼灯

家里顶灯太暗了且高度太高&#xff0c;还是原始的LED灯&#xff0c;晚上用着眼睛都有点难受&#xff0c;还好遇到了儿童护眼灯。下面小编为大家介绍下儿童护眼灯哪个牌子好&#xff1f;什么护眼台灯比较专业 护眼台灯怎么样选择 1、照度级别 台灯照度级别分为 A 级和 AA 级。…

Centos虚拟机忘记密码-修改密码

1.重启系统 2.在这个选择界面&#xff0c;按e建 3.找到如下位置&#xff0c;插入init/bin/sh 4.填写完成后按Ctrlx引导启动 5.输入mount -o remount, rw / (注意空格) 6.重置密码 出现以下为重置成功 7.执行touch /.autorelabel 8.退出exec /sbin/init 9.输入你的新密…

多态的使用

1、认识多态 面向对象三大特征&#xff1a;封装、继承、多态 什么是多态&#xff1f; 同类型的对象&#xff0c;表现出不同的形态。&#xff08;对象的多种形态。&#xff09; 多态的表现形式&#xff1f; 父类类型 对象名称 子类对象&#xff1…

SpringBoot项目-个人博客系统的实现

1.博客系统简要分析 一共有6个网页&#xff0c;分别是博客列表页面&#xff0c;博客详情页面&#xff0c;发布博客页面&#xff0c;博客登陆页面&#xff0c;博客更新页面&#xff0c;修改个人信息页面&#xff08;暂未实现&#xff09;&#xff0c;我们要实现的功能有&#xf…

什么是 MySQL 的“回表”?怎么减少回表的次数?

什么是 MySQL 的“回表”&#xff1f;怎么减少回表的次数&#xff1f; 索引结构 要搞明白这个问题&#xff0c;需要大家首先明白 MySQL 中索引存储的数据结构。这个其实很多小伙伴可能也都听说过&#xff0c;BTree 嘛&#xff01; BTree 是什么&#xff1f;那你得先明白什么…

使用Python将图像转换为PDF:一次性解决您的批量转换需求

导语&#xff1a; 在数字化时代&#xff0c;我们经常需要处理大量的图像文件。将这些图像转换为PDF格式可以方便地存档、分享和打印。本文将介绍如何使用Python编程语言将图像批量转换为PDF&#xff0c;并提供了一个简单易用的图形界面来跟踪转换进度。 准备工作 在开始之前…

AI编程工具Copilot与Codeium的实测对比

csdn原创谢绝转载 简介 现在没有AI编程工具&#xff0c;效率会打一个折扣&#xff0c;如果还没有&#xff0c;赶紧装起来&#xff0e; GitHub Copilot是OpenAi与github等共同开发的的AI辅助编程工具&#xff0c;基于ChatGPT驱动&#xff0c;功能强大&#xff0c;这个没人怀疑…

Linux进程(二)

文章目录 进程&#xff08;二&#xff09;Linux的进程状态R &#xff08;running&#xff09;运行态S &#xff08;sleeping&#xff09;阻塞状态D &#xff08;disk sleep&#xff09;深度睡眠T&#xff08;stopped&#xff09;状态X&#xff08;dead&#xff09;状态Z&#x…