当前位置: 首页 > news >正文

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

在这里插入图片描述

统一硬盘操作

    • 创建出实例
    • 封装交换机的操作
    • 封装队列的操作
    • 封装绑定的操作
    • 封装消息的操作
    • 总的完整代码:

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

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

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

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

使用这个类来管理所有的硬盘上的数据:
一个是数据库:交换机,绑定,队列
一个是数据文件:消息
上层逻辑如果需要操作硬盘,统一都通过这个类来使用(上层代码不在乎当前数据是在数据文件中还是数据库中)

创建出实例

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

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

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

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

封装交换机的操作

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

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

封装队列的操作

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

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

封装绑定的操作

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

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

封装消息的操作

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

//封装消息操作  //发送消息  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类的总代码如下所示:

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类即可

http://www.xdnf.cn/news/273979.html

相关文章:

  • C++入门小馆:继承
  • 数据库-数据类型,表的约束和基本查询操作
  • SONiC-OTN代码详解(具体内容待续)
  • set autotrace报错
  • K8S的使用(部署pod\service)+安装kubesphere图形化界面使用和操作
  • 【机器学习案列-22】基于线性回归(LR)的手机发布价格预测
  • 【iOS】消息流程探索
  • 基于python的task--时间片轮询
  • 为了结合后端而学习前端的学习日志——【黑洞光标特效】
  • VMware-centOS7安装redis分布式集群
  • 《Java高级编程:从原理到实战 - 进阶知识篇五》
  • 统计学中的p值是什么?怎么使用?
  • Ray开源程序 是用于扩展 AI 和 Python 应用程序的统一框架。Ray 由一个核心分布式运行时和一组用于简化 ML 计算的 AI 库组成
  • 初识 iOS 开发中的证书固定
  • flink常用算子整理
  • QT | 常用控件
  • 个人文章不设置vip
  • MySQL复合查询全解析:从基础到多表关联与高级技巧
  • 【Hive入门】Hive与Spark SQL深度集成:Metastore与Catalog兼容性全景解析
  • 视频转GIF
  • 网狐系列三网通新钻石娱乐源码全评:结构拆解、三端实测与本地部署问题记录
  • ResNet改进(37):DenseBlock模块实现
  • 游戏引擎学习第257天:处理一些 Win32 相关的问题
  • 【Python】一直没搞懂迭代器是什么。。
  • 【Linux】SELinux 的基本操作与防火墙的管理
  • C++负载均衡远程调用学习之上报功能与存储线程池
  • QT对象树
  • C++日志系统实现(二)
  • 三种方式存图分别输出“无向无权图”的“DFS序列”
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.2 缺失值检测与处理(NULL值填充/删除策略)