【项目篇之统一硬盘操作】仿照RabbitMQ模拟实现消息队列

统一硬盘操作

我们之前已经使用了数据库去管理交换机,绑定,队列

还使用了数据文件去管理消息

此时我们就搞一个类去把上述两个部分都整合在一起,对上层提供统一的一套接口

在项目文件中的datacenter这个包下面创建一个新的类:DiskDataCenter

使用这个类来管理所有的硬盘上的数据:

一个是数据库:交换机,绑定,队列

一个是数据文件:消息

上层逻辑如果需要操作硬盘,统一都通过这个类来使用(上层代码不在乎当前数据是在数据文件中还是数据库中)

创建出实例

我们先去创建出数据库实例和数据文件的实例:

java 复制代码
 //把数据库实例创建出来  
    private DataBaseMapper dataBaseMapper = new DataBaseMapper();  
    //把数据文件的实力创建出来  
    private MessageFileManager messageFileManager = new MessageFileManager();  
  

接着对这两个实例进行初始化:

java 复制代码
//初始化方法:针对上面的两个实例进行初始化  
    public void init(){  
        dataBaseMapper.init();  
        //下面这个是空的方法,后续要扩展再写  
        messageFileManager.init();  
    } 

封装交换机的操作

我们这里是使用刚刚创建出来的数据库的实例dataBaseMapper去封装了插入交换机,删除交换机,查询交换机:

java 复制代码
//封装交换机的三个操作  
    //插入交换机  
    public void insertExchange(Exchange exchange){  
        dataBaseMapper.insertExchange(exchange);  
    }  
    //删除交换机  
    public void deleteExchange(String exchangeName){  
        dataBaseMapper.deleteExchange(exchangeName);  
    }  
    //查询交换机  
    public List<Exchange> selectAllExchanges(){  
        return dataBaseMapper.selectAllexchanges();  
    }  
  

封装队列的操作

我们这里是使用刚刚创建出来的数据库的实例dataBaseMapper去封装了插入队列,删除队列,查询队列:

java 复制代码
//封装队列的三个操作  
    //插入队列  
    public void insertQueue(MSGQueue queue){  
        dataBaseMapper.insertQueue(queue);  
    }  
    //删除队列  
    public void deleteQueue(String queueName){  
        dataBaseMapper.deleteQueue(queueName);  
    }  
    //查询队列  
    public List<MSGQueue> selectAllQueue(){  
        return dataBaseMapper.selectAllQueues();  
    }  

封装绑定的操作

我们这里是使用刚刚创建出来的数据库的实例dataBaseMapper去封装了插入绑定,删除绑定,查询绑定:

java 复制代码
//封装绑定的三个操作  
    //插入绑定  
    public void insertBinding(Binding binding){  
        dataBaseMapper.insertBinding(binding);  
    }  
  
    //删除绑定  
    public void deleteBinding(Binding binding){  
        dataBaseMapper.deleteBinding(binding);  
    }  
    //查询绑定  
    public List<Binding> selectAllBindings(){  
        return dataBaseMapper.selectAllBindings();  
    }  

封装消息的操作

我们这里是使用刚刚创建出来的数据文件的实例messageFileManager去封装了发送消息,删除消息,加载队列中的所有消息:

java 复制代码
//封装消息操作  
    //发送消息  
    public void sendMessage(MSGQueue queue, Message message) throws IOException, MqException {  
        messageFileManager.sendMessage(queue,message);  
    }  
  
    //删除消息  
    //考虑删除了之后,多了一个无效消息,看看是不是要进行垃圾回收  
    public void deleteMessage(MSGQueue queue, Message message) throws IOException, ClassNotFoundException, MqException {  
        messageFileManager.deleteMessage(queue,message);  
        if(messageFileManager.checkGC(queue.getName())){  
            messageFileManager.gc(queue);  
        }  
    }  
	  //加载队列中的所有消息
    public LinkedList<Message> loadAllMessageFromQueue(String queueName) throws IOException, MqException, ClassNotFoundException {  
        return messageFileManager.loadAllMessageFromQueue(queueName);  
    }

总的完整代码:

这个DiskDataCenter类的总代码如下所示:

java 复制代码
package org.example.mqtexxt.mqserver.datacenter;  
  
import org.example.mqtexxt.common.MqException;  
import org.example.mqtexxt.mqserver.core.Binding;  
import org.example.mqtexxt.mqserver.core.Exchange;  
import org.example.mqtexxt.mqserver.core.MSGQueue;  
import org.example.mqtexxt.mqserver.core.Message;  
  
import java.io.IOException;  
import java.util.LinkedList;  
import java.util.List;  
  
/*  
使用这个类来管理所有的硬盘上的数据:  
一个是数据库:交换机,绑定,队列  
一个是数据文件:消息  
上层逻辑如果需要操作硬盘,统一都通过这个类来使用(上层代码不在乎当前数据是在数据文件中还是数据库中)  
 */
 public class DiskDataCenter {  
  
    //把数据库实例创建出来  
    private DataBaseMapper dataBaseMapper = new DataBaseMapper();  
    //把数据文件的实力创建出来  
    private MessageFileManager messageFileManager = new MessageFileManager();  
  
    //初始化方法:针对上面的两个实例进行初始化  
    public void init(){  
        dataBaseMapper.init();  
        //下面这个是空的方法,后续要扩展再写  
        messageFileManager.init();  
    }  
  
  
    //封装交换机的三个操作  
    //插入交换机  
    public void insertExchange(Exchange exchange){  
        dataBaseMapper.insertExchange(exchange);  
    }  
    //删除交换机  
    public void deleteExchange(String exchangeName){  
        dataBaseMapper.deleteExchange(exchangeName);  
    }  
    //查询交换机  
    public List<Exchange> selectAllExchanges(){  
        return dataBaseMapper.selectAllexchanges();  
    }  
  
    //封装队列的三个操作  
    //插入队列  
    public void insertQueue(MSGQueue queue){  
        dataBaseMapper.insertQueue(queue);  
    }  
    //删除队列  
    public void deleteQueue(String queueName){  
        dataBaseMapper.deleteQueue(queueName);  
    }  
    //查询队列  
    public List<MSGQueue> selectAllQueue(){  
        return dataBaseMapper.selectAllQueues();  
    }  
  
    //封装绑定的三个操作  
    //插入绑定  
    public void insertBinding(Binding binding){  
        dataBaseMapper.insertBinding(binding);  
    }  
  
    //删除绑定  
    public void deleteBinding(Binding binding){  
        dataBaseMapper.deleteBinding(binding);  
    }  
    //查询绑定  
    public List<Binding> selectAllBindings(){  
        return dataBaseMapper.selectAllBindings();  
    }  
  
    //封装消息操作  
    //发送消息  
    public void sendMessage(MSGQueue queue, Message message) throws IOException, MqException {  
        messageFileManager.sendMessage(queue,message);  
    }  
  
    //删除消息  
    //考虑删除了之后,多了一个无效消息,看看是不是要进行垃圾回收  
    public void deleteMessage(MSGQueue queue, Message message) throws IOException, ClassNotFoundException, MqException {  
        messageFileManager.deleteMessage(queue,message);  
        if(messageFileManager.checkGC(queue.getName())){  
            messageFileManager.gc(queue);  
        }  
    }  
	  //加载队列中的所有消息
    public LinkedList<Message> loadAllMessageFromQueue(String queueName) throws IOException, MqException, ClassNotFoundException {  
        return messageFileManager.loadAllMessageFromQueue(queueName);  
    }
}

DiskDataCenter类主要就是去封装了消息的基本操作,其实也就是把之前的MessageFileManager类和DataBaseMapper类的关键方法统一进行了封装操作

后续的代码中,上层代码就不用直接去调用MessageFileManager类和DataBaseMapper类了

上层代码而是直接去调用这个DiskDataCenter类即可

相关推荐
知行合一。。。2 小时前
RAG--03--Milvus基本用法
数据库·oracle·milvus
2601_962071572 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
TDengine (老段)2 小时前
TDengine 线程模型 — 网络、调度、执行
大数据·数据库·物联网·制造·时序数据库·tdengine·涛思数据
zww89491113 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
上学的小垃圾3 小时前
01-数据库系统概述
数据库
二进制漫游记4 小时前
FastAPI项目集成 Qdrant向量数据库+阿里云Embedding完整实战(工具封装+业务调用)
数据库·python·阿里云·embedding
2501_928996224 小时前
GPT-4o换DeepSeek迁移成本多少?中科热备解析API聚合平台技术账本
前端·数据库·人工智能
zww89491115 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
泡干脆面就番茄6 小时前
MySQL_子查询_分页查询与联合查询详解
数据库·mysql
黑马程序员毕设6 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设