基于RabbitMQ的模拟消息队列之三——硬盘数据管理

news2024/11/21 2:34:03

文章目录

    • 一、数据库管理
      • 1.设计数据库
      • 2.添加sqlite依赖
      • 3.配置application.properties文件
      • 4.创建接口MetaMapper
      • 5.创建MetaMapper.xml文件
      • 6.数据库操作
      • 7.封装数据库操作
    • 二、文件管理
      • 1.消息持久化
      • 2.消息文件格式
      • 3.序列化/反序列化
      • 4.创建文件管理类MessageFileManager
      • 5.垃圾回收
    • 三、统一管理数据库和文件

一、数据库管理

1.设计数据库

交换机、队列、绑定是交给数据库来管理的,所以,设计这三个表结构就够了,表的字段和核心类同名。

2.添加sqlite依赖

<!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
		<dependency>
			<groupId>org.xerial</groupId>
			<artifactId>sqlite-jdbc</artifactId>
			<version>3.41.0.0</version>
		</dependency>

3.配置application.properties文件

spring.datasource.url=jdbc:sqlite:./data/meta.db
spring.datasource.username=
spring.datasource.password=
spring.datasource.driver-class-name=org.sqlite.JDBC
mybatis.mapper-locations=classpath:mybatis/*Mapper.xml

4.创建接口MetaMapper

在mqserver包下新创建一个包,名字为mapper,在此包下,创建一个接口MetaMapper。添加注解@Mapper

5.创建MetaMapper.xml文件

在resource目录下,创建一个目录mybatis,在此目录下新建一个MetaMapper.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.MetaMapper">
    
</mapper>

6.数据库操作

建库操作会在程序启动时,由mybatis在./data/meta.db这里自动生成。
所以这里只用针对交换机、队列、绑定创建表以及简单的插入、删除、查询操作就够了。
MetaMapper:
在这里插入图片描述
MetaMapper.xml:
在这里插入图片描述

7.封装数据库操作

新建一个包datacenter,创建一个类DatabaseManager,封装上述的数据库操作。

  • 初始化数据库

准备工作:因为我们不打算把当前类注入容器,所有需要手动从上下文中获取Bean对象。在启动类中获取上下文。
在这里插入图片描述

如果数据库已经存在,什么都不做(检查./data/meta.db是否存在);

如果不存在,创建目录,建表,插入默认数据。
在这里插入图片描述
在这里插入图片描述

  • 删除数据库文件及目录

    删除文件(./data/meta.db)

    删除目录(./data)

在这里插入图片描述

  • 封装交换机、队列、绑定操作

在这里插入图片描述

二、文件管理

1.消息持久化

将消息持久化就是将消息存储到文件中。
在data目录下,每个队列又对应一个子目录,与队列名一致。子目录下有两个文件,一个是消息内容文件(queue_data.txt),一个是消息统计文件(queue_stat.txt)。
形如:
在这里插入图片描述

2.消息文件格式

  • queue_data.txt (消息内容文件)

在这里插入图片描述

实例:在这里插入图片描述

  • queue_stat.txt (消息统计文件)

    消息总数数 /t 有效消息数

    形如:2300/t1800

3.序列化/反序列化

在common包下添加一个公共工具类BinaryTool,实现序列化、反序列化

  • 序列化
    1.把byte数组写到ByteArrayOutputStream
    2.用ObjectOutputStream关联ByteArrayOutputStream
    3.调用ObjectOutputStream的writeObject方法,将object序列化成二进制数据,写入ByteArrayOutputStream中
    4.调用ByteArrayOutputStream的toByteArray,输出byte[]数组
    在这里插入图片描述

  • 反序列化
    1.使用ByteArrayInputStream读取byte数组
    2.使用ObjectInputStream关联ByteArrayInputStream
    3.使用ObjectInputStream的readObject方法,读取字节数组出来,再反序列化成Object对象,使用Object接收
    4.返回Object对象
    在这里插入图片描述

4.创建文件管理类MessageFileManager

  • 获取目录

在这里插入图片描述

  • 消息统计文件读写

    将消息统计文件的内容封装成一个类Stat。属性有消息总数,有效消息数。
    在这里插入图片描述

  • 创建目录及文件
    在这里插入图片描述

  • 删除目录及文件
    在这里插入图片描述

  • 检查文件是否存在
    在这里插入图片描述

  • 写入消息

    以追加的方式写入到文件中。
    在这里插入图片描述

  • 删除消息(逻辑删除)

    定位到消息所处文件的位置,将消息反序列化出来,修改isValid为0x0,然后写回文件原位置。

在这里插入图片描述

  • 读取消息
    在这里插入图片描述

5.垃圾回收

此处约定,当消息总数超过2000并且有效消息数小于30%时,触发垃圾回收机制。
此处的垃圾回收机制采用复制算法。

  • 触发垃圾回收
    在这里插入图片描述
  • 垃圾回收
    在这里插入图片描述

三、统一管理数据库和文件

创建DiskDataCenter,整合数据库和文件。

  • 初始化
  • 封装交换机、队列(创建队列时创建目录,删除队列时删除目录)、绑定操作
  • 封装消息操作
    在这里插入图片描述

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

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

相关文章

【校招VIP】测试计划之测试分类

考点介绍&#xff1a; 本专题主要介绍了软件测试在不同场景下的划分。并且讲解了基于软件测试的划分衍生出的常见面试题。 测试分类也是校招里面考察的一个重点。 『测试计划之测试分类』相关题目及解析内容可点击文章末尾链接查看&#xff01; 一、考点试题 1.软件测试按开…

【安卓】拿注册码的两种方式

【安卓】拿注册码的两种方式 文章仅用于学习交流&#xff0c;请勿利用文章中的技术对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xff0c;均由使用者本人负责。首发吾爱&#xff1a;https://www.52pojie.cn/thread-1826802-1-1.html言归…

OBS Studio 30.0 承诺在 Linux 上支持英特尔 QSV,为 DeckLink 提供 HDR 回放功能

导读OBS Studio 30.0 现已推出公开测试版&#xff0c;承诺为这款广受欢迎的免费开源截屏和流媒体应用程序提供多项令人兴奋的新功能&#xff0c;以及大量其他更改和错误修复。 OBS Studio 30.0 承诺在 Linux 上支持英特尔 QSV&#xff08;快速同步视频&#xff09;、WHIP/WebRT…

Makefile介绍与使用

Make简介 工程管理器&#xff0c;顾名思义&#xff0c;是指管理较多的文件 Make工程管理器也就是个“”自动编译管理器”&#xff0c;这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量&#xff0c;同事&#xff0c;它通过读入Makefile文件的内…

问道管理:市场热点有望轮动表现 关注数据要素等主题板块

近期两市指数继续单边下行趋势仍未扭转&#xff0c;短期利好后指数虽有反弹&#xff0c;但上方仍然压力重重&#xff0c;短期或仍然以反复筑底为主。因而&#xff0c;在国内根本面仍未强势复苏前&#xff0c;指数技能面上仍然会有限制&#xff0c;短期反弹修正后或仍有反复&…

RNN循环神经网络

目录 一、卷积核与循环核 二、循环核 1.循环核引入 2.循环核&#xff1a;循环核按时间步展开。 3.循环计算层&#xff1a;向输出方向生长。 4.TF描述循环计算层 三、TF描述循环计算 四、RNN使用案例 1.数据集准备 2.Sequential中RNN 3.存储模型&#xff0c;acc和lose…

MAC M2芯片执行yolov8 + deepsort 实现目标跟踪

MAC M2芯片执行yolov8 deepsort 实现目标跟踪 MAC M2 YoloX bytetrack实现目标跟踪 实验结果 MAC mps显存太小了跑不动 还是得用服务器跑 需要实验室的服务器跑 因为网上花钱跑4天太贵了&#xff01;&#xff01;&#xff01; 步骤过程尝试&#xff1a; 执行mot17 数据集 …

FSPI的PCB设计

FSPI是一种灵活的串行接口控制器&#xff0c;RK3588芯片中有1个FSPI控制器&#xff0c;可用来连接FSPI设备。 RK3588 FSPI 控制器有如下特点&#xff1a; 1&#xff09;支持串行NOR Flash&#xff0c;串行Nand Flash&#xff1b; 2&#xff09;支持SDR模式&#xff1b; 3&am…

Android屏幕显示 android:screenOrientation configChanges 处理配置变更 代码中动态切换横竖屏

显示相关 屏幕朝向 https://developer.android.com/reference/android/content/res/Configuration.html#orientation 具体区别如下&#xff1a; activity.getResources().getConfiguration().orientation获取的是当前设备的实际屏幕方向值&#xff0c;可以动态地根据设备的旋…

【STM32】学习笔记(EXTI)-江科大

EXTI外部中断 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行 中断优先级&#x…

【Python数据分析】数据分析之numpy基础

实验环境&#xff1a;建立在Python3的基础之上 numpy提供了一种数据类型&#xff0c;提供了数据分析的运算基础&#xff0c;安装方式 pip install numpy导入numpy到python项目 import numpy as np本文以案例的方式展示numpy的基本语法&#xff0c;没有介绍语法的细枝末节&am…

电商数仓项目需求及架构设计

一、项目需求 1.用户行为数据采集平台搭建 2.业务数据采集平台搭建 3.数仓维度建模 4.统计指标 5.即席查询工具&#xff0c;随时进行指标分析 6.对集群性能进行监控&#xff0c;发生异常时报警&#xff08;第三方信息&#xff09; 7.元数据管理 8.质量监控 9.权限管理&#xff…

streamlit-API

介绍 安装 pip install streamlit运行 streamlit run your_script.py [-- script args]数据流 多页应用程序 API 文本元素 数据元素 图标元素 输入小部件 媒体元素 布局和容器 聊天元素 st.chat_message st.chat_input 显示进度和状态 控制流 占位符/帮助/选项 图表改变 会…

SpringBoot工具类—基于定时器完成文件清理功能

直接复制粘贴既可&#xff01;&#xff01; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.io.File; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneOff…

云职达(上海)岗前实训基地(上海云职达):致力为企业提供良好的数字化解决方案

上海云职达全称&#xff1a;云职达上海信息科技有限公司&#xff0c;是一家致力于推动算力产业发展的企业。随着数字经济时代的到来&#xff0c;算力作为数字产业化和产业数字化转型的关键支撑&#xff0c;已经成为推进中国式现代化的重要驱动力量。云职达深入理解算力产业的重…

星辰天合荣获“2023年度优秀光伏行业数字化供应商”

8 月 28 日&#xff0c;由 OFweek 维科网及旗下权威的光伏专业媒体-维科网光伏共同举办的“OFweek 2023&#xff08;第十四届&#xff09;太阳能光伏产业大会暨光伏行业年度颁奖典礼”在深圳成功举办。 星辰天合凭借在光伏领域的优秀智能存储解决方案&#xff0c;以及大量的应用…

Rdedis 持久化

Redis 是内存数据库&#xff0c;如果不将内存中的数据库状态保存到磁盘&#xff0c;那么一旦服务器进程退出&#xff0c;服务器中的数据库状态也会消失。所以 Redis 提供了持久化功能&#xff01; 一、RDB&#xff08;Redis DataBase&#xff09; 1.1 概念 在指定的时间间隔内…

冠达管理:2023股票交易新规则详解?股票手续费包括哪些?

投资者进行股票投资时不是随便就可以进行生意的&#xff0c;需求恪守一定的生意规则&#xff0c;才干顺利成交。那么2023股票生意新规则详解&#xff1f;股票手续费包含哪些&#xff1f;下面就由冠达管理为大家分析&#xff1a; ​ 2023股票生意新规则详解&#xff1f; 1、约…

EDFHG-04-200-3C2-XY-31T001电液比例大流量调速阀放大器

EDFHG-03-100-3C40-XY-30T、EDFHG-03-100-3C2-XY-30T、EDFHG-04-140-3C40-XY-30T、EDFHG-04-140-3C2-XY-30T、EDFHG-06-140-3C40-XY-30T、EDFHG-06-140-3C2-XY-30T、EDFHG-04-200-3C2-XY-31T001、EDFHG-06-400-3C2-XY-31T001、EDFHG-06-400-3C40-XY-31T001电液比例换向调速阀采…

vue3 ref reactive响应式数据 赋值的问题

文章目录 vue3 ref reactive响应式数据 赋值的问题场景1:将响应式数据赋值请求后的数据错误示范&#xff1a;直接赋值正确写法 场景2&#xff1a;响应式数据解构之后失去响应式原因分析解决办法 toRefs/toRef方法创建ref引用对象 vue3 ref reactive响应式数据 赋值的问题 doing…