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

这篇具有很好参考价值的文章主要介绍了基于RabbitMQ的模拟消息队列之三——硬盘数据管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、数据库管理

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:
基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式
MetaMapper.xml:
基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

7.封装数据库操作

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

  • 初始化数据库

准备工作:因为我们不打算把当前类注入容器,所有需要手动从上下文中获取Bean对象。在启动类中获取上下文。
基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

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

如果不存在,创建目录,建表,插入默认数据。
基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式
基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

  • 删除数据库文件及目录

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

    删除目录(./data)

基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

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

基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

二、文件管理

1.消息持久化

将消息持久化就是将消息存储到文件中。
在data目录下,每个队列又对应一个子目录,与队列名一致。子目录下有两个文件,一个是消息内容文件(queue_data.txt),一个是消息统计文件(queue_stat.txt)。
形如:
基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

2.消息文件格式

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

基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

实例:基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

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

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

    形如:2300/t1800

3.序列化/反序列化

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

  • 序列化
    1.把byte数组写到ByteArrayOutputStream
    2.用ObjectOutputStream关联ByteArrayOutputStream
    3.调用ObjectOutputStream的writeObject方法,将object序列化成二进制数据,写入ByteArrayOutputStream中
    4.调用ByteArrayOutputStream的toByteArray,输出byte[]数组
    基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

  • 反序列化
    1.使用ByteArrayInputStream读取byte数组
    2.使用ObjectInputStream关联ByteArrayInputStream
    3.使用ObjectInputStream的readObject方法,读取字节数组出来,再反序列化成Object对象,使用Object接收
    4.返回Object对象
    基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

4.创建文件管理类MessageFileManager

  • 获取目录

基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

  • 消息统计文件读写

    将消息统计文件的内容封装成一个类Stat。属性有消息总数,有效消息数。
    基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

  • 创建目录及文件
    基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

  • 删除目录及文件
    基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

  • 检查文件是否存在
    基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

  • 写入消息文件

    以追加的方式写入到文件中。
    基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

  • 删除消息(逻辑删除)

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

基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

  • 读取消息文件
    基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

5.垃圾回收

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

  • 触发垃圾回收
    基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式
  • 垃圾回收
    基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

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

创建DiskDataCenter,整合数据库和文件。文章来源地址https://www.toymoban.com/news/detail-685521.html

  • 初始化
  • 封装交换机、队列(创建队列时创建目录,删除队列时删除目录)、绑定操作
  • 封装消息操作
    基于RabbitMQ的模拟消息队列之三——硬盘数据管理,rabbitmq,分布式

到了这里,关于基于RabbitMQ的模拟消息队列之三——硬盘数据管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 基于RabbitMQ的模拟消息队列之二---创建项目及核心类

    基于RabbitMQ的模拟消息队列之二---创建项目及核心类

    创建一个SpringBoot项目,环境:JDK8,添加依赖:Spring Web、MyBatis FrameWork(最主要) 2.核心类 在mqserver包中添加一个包,名字为core,表示核心类。 Exchange ExchangeType MSGQueue (为了区分Queue) Binding Message BasicProperties

    2024年02月11日
    浏览(10)
  • 根据源码,模拟实现 RabbitMQ - 实现消息持久化,统一硬盘操作(3)

    根据源码,模拟实现 RabbitMQ - 实现消息持久化,统一硬盘操作(3)

    目录 一、实现消息持久化 1.1、消息的存储设定 1.1.1、存储方式 1.1.2、存储格式约定 1.1.3、queue_data.txt 文件内容  1.1.4、queue_stat.txt 文件内容 1.2、实现 MessageFileManager 类 1.2.1、设计目录结构和文件格式 1.2.2、实现消息的写入 1.2.3、实现消息的删除(随机访问文件) 1.2.4、获取队

    2024年02月12日
    浏览(12)
  • 模拟实现消息队列(以 RabbitMQ 为蓝本)

    模拟实现消息队列(以 RabbitMQ 为蓝本)

    核心概念1 生产者(Producer):生产者负责生成数据并将其放入缓冲区(队列)中。生产者可以是一个线程或多个线程,它们可以并行地生成数据。当缓冲区(队列)已满时,生产者需要等待,直到有空间可用。 消费者(Consumer):消费者负责从缓冲区(队列)中取出数据并进行处

    2024年02月13日
    浏览(13)
  • 手写消息队列(基于RabbitMQ)

    手写消息队列(基于RabbitMQ)

    提到消息队列是否唤醒了你脑海深处的记忆?回看前面的这篇文章:《Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)》,其中我们在介绍阻塞队列时说过,阻塞队列最大的用途就是实现 生产者消费者模型 。 我们知道对于生产者消费者模型来说,它具有两个十分

    2024年02月05日
    浏览(12)
  • SpringCloud-实现基于RabbitMQ的消息队列

    消息队列是现代分布式系统中常用的通信机制,用于在不同的服务之间传递消息。在Spring Cloud框架中,我们可以利用RabbitMQ实现强大而可靠的消息队列系统。本篇博客将详细介绍如何在Spring Cloud项目中集成RabbitMQ,并创建一个简单的消息队列。 这里是一个简单的RabbitMQ消息队列

    2024年03月11日
    浏览(13)
  • RabbitMQ - 基于 SpringAMQP 带你实现五种消息队列模型

    RabbitMQ - 基于 SpringAMQP 带你实现五种消息队列模型

    目录 一、SpringAMQP 1.1、概念 1.2、前置知识(实现案例前必看!) 1.2.1、创建队列 1.2.2、创建交换机 1.2.3、创建绑定 1.2.4、@RabbitListener 注解 a)情况一:queue 存在 b)情况二:queue 不存在  1.2.5、为什么更建议使用 @Bean 注解创建,而不是 @RabbitListener 注解创建? 1.3、案例实现

    2024年04月12日
    浏览(13)
  • 基于golang多消息队列中间件的封装nsq,rabbitmq,kafka

    场景 在创建个人的公共方法库中有这样一个需求,就是不同的项目会用到不同的消息队列中间件,我的思路把所有的消息队列中间件进行封装一个消息队列接口(MQer)有两个方法一个生产一个消费,那么在实例化对象的时候根据配置文件指定当前项目使用的那个消息队列中

    2024年02月14日
    浏览(48)
  • 消息队列(三):硬盘管理

    消息队列(三):硬盘管理

    我在第一章提到过:关于持久化那一块,在内存存储主要是获取比较方便,在硬盘上存储主要是为了长时间存储。 关于内存管理又分两部分:数据库管理和文件管理(主要是和消息有关)。 硬盘中的数据库管理其实在上一章的建库建表说过了,就这么几步,SQLite + MyBatis 几十

    2024年02月09日
    浏览(11)
  • 项目实战 — 消息队列(5){统一硬盘操作}

    项目实战 — 消息队列(5){统一硬盘操作}

    前面已经使用数据库管理了交换机、绑定、队列,然后又使用了数据文件管理了消息。 那么,这里就创建一个类,讲之前的两个部分整合起来,对上层提供统一的一套接口,表示硬盘上存储的所有的类的信息。  创建了这个类,我们就不用去直接调用DataBaseManager和MessageFile

    2024年02月14日
    浏览(11)
  • RabbitMQ实现延迟消息,RabbitMQ使用死信队列实现延迟消息,RabbitMQ延时队列插件

    RabbitMQ实现延迟消息,RabbitMQ使用死信队列实现延迟消息,RabbitMQ延时队列插件

    假设有一个业务场景:超过30分钟未付款的订单自动关闭,这个功能应该怎么实现? RabbitMQ使用死信队列,可以实现消息的延迟接收。 队列有一个消息过期属性。就像丰巢超过24小时就收费一样,通过设置这个属性,超过了指定事件的消息将会被丢弃。 这个属性交:x-message

    2024年02月13日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包