【项目篇之统一硬盘操作】仿照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.mzph.cn/diannao/82128.shtml

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

相关文章

快速上手SpringBoot开发指南

文章目录 1. 项目整体架构2. SpringBoot核心注解详解2.1 应用程序入口注解SpringBootApplication 2.2 控制器层注解RestControllerRequestMappingPostMappingRequestBody 2.3 服务层注解ServiceAutowired 2.4 数据访问层注解Repository 2.5 实体类注解JPA相关注解Lombok注解 3.…

Unity WebGL、js发布交互

官网参考 Unity3D开发之WebGL平台上 unity和js前端通信交互 WebFun.jslib mergeInto(LibraryManager.library, {JSLog: function (str) { var strsUTF8ToString(str); Log(str); Log(strs);}, Hello: function () {var strs"Hello, world!"; Log(strs); Log(UTF8ToS…

Spark 之 YarnCoarseGrainedExecutorBackend

YarnCoarseGrainedExecutorBackend executor ID , 在日志里也有体现。 25/05/06 12:41:58 INFO YarnCoarseGrainedExecutorBackend: Successfully registered with driver 25/05

[HOT 100] 2646. 最小化旅行的价格总和

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 2646. 最小化旅行的价格总和 - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 现有一棵无向、无根的树&#xff0c;树中有 n 个节点&#xff0c;按从 0 到 n - 1 编号。给你一…

分析 Docker 磁盘占用

以下是分析 Docker 磁盘占用的详细步骤和工具指南&#xff0c;帮助开发者快速定位和清理冗余数据&#xff1a; 1. 查看 Docker 磁盘使用概览 docker system df 输出说明&#xff1a; TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 15 …

聊一聊接口测试中的参数化测试

目录 一、核心概念 二、适用场景 三、参数化测试的核心目的 四、实现参数化测试的关键步骤 4.1 定义测试数据 4.2 使用测试框架参数化功能 4.3 执行测试与结果分析 五、最佳实践与注意事项 六、工具推荐 那参数化测试的目的是什么&#xff1f;应该是为了提高测试覆盖率…

Go语言——string、数组、切片以及map

一、string、数组、切片代码 package mainimport "fmt"// 定义结构体 type student struct {id intname stringage intscore float32 }func main() {// 使用var声明切片var slice1 []intslice1 append(slice1, 1)slice1 append(slice1, 2)slice1 append(sl…

Android 开发中JDK 的使用和配置详解

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。 👉点击跳转到教程 在安卓开发中, 我们会使用到Java的JDK, JDK全程为(Java Development Kit)意思是:Java开发工具包。那么JDK 与我们的…

MPay码支付系统第四方聚合收款码多款支付插件个人免签支付源码TP8框架全开源

一、源码描述 这是一套码支付源码&#xff08;MPay&#xff09;&#xff0c;基于TP8框架&#xff0c;前端layui2.9后端PearAdmin&#xff0c;专注于个人免签收款&#xff0c;通过个人的普通收款码&#xff0c;即可实现收款通知自动回调&#xff0c;支持绝大多数商城系统&#…

国产数据库铸就数字基建新基石,助力农业产业转型升级

中国科技企业以自主创新突破技术壁垒&#xff0c;为全球产业链重构注入新动能。广东辰宜信息科技有限公司&#xff08;以下简称“辰宜科技”&#xff09;凭借自主研发的“博流分布式多模数据库”等核心技术&#xff0c;作为支持数据流通的关键技术支撑&#xff0c;实现中国基础…

《人工智能:如何重塑教育模式与学习图景》

《人工智能&#xff1a;如何重塑教育模式与学习图景》 引言 人工智能&#xff0c;特别是大型语言模型&#xff08;如GPT-4/ChatGPT&#xff09;&#xff0c;正以前所未有的速度影响教育领域。从基础教育到高等教育&#xff0c;再到职业教育&#xff0c;传统教学模式正在被重新审…

硬件工程师面试常见问题(14)

第六十六问&#xff1a;运放--输入偏置电流和输入失调电流 输入偏置电流lb&#xff1a;是由于运放两个输入极都有漏电流的存在。实际的运放,会有电流流入运放的输入端的。那么输入偏置电流就定义这两个电流的平均值。 输入失调电流 Ios&#xff1a;定义为两个差分输入端偏置电…

Docker+Kubernetes落地指南:从单机到集群的平滑迁移

一、为何必须升级到Kubernetes&#xff1f; 1.1 单机Docker的瓶颈 单机环境痛点&#xff1a; ├─ 资源利用率不均衡&#xff08;CPU飙高 vs 内存闲置&#xff09; ├─ 服务扩容需手动操作 ├─ 零宕机更新难以实现 └─ 网络配置复杂&#xff08;跨主机通信困难&am…

HttpPrinter 是一款功能强大的跨平台 Web 打印解决方案

HttpPrinter 是一款功能强大的跨平台 Web 打印解决方案&#xff0c;支持多种编程语言和打印场景&#xff0c;适用于企业级报表打印、静默打印、远程打印等需求。以下是其核心功能、技术特点及使用方法的综合分析&#xff1a; 一、核心功能与特点 跨平台与多语言支持 支持 Java…

Selenium Web自动化测试学习笔记(一)

自动化测试 技术手段模拟人工&#xff0c;执行重复性任务&#xff0c;准确率100%&#xff0c;高于人工 selenium 可通过浏览器驱动控制浏览器&#xff0c;通过元素定位模拟人工&#xff0c;实现web自动化&#xff0c;没有焦点&#xff08;把浏览器放在最小化依然可以&#x…

TikTok 矩阵运营新手实操保姆级教程 2.0 版本

在当下这个全球化的数字浪潮中&#xff0c;TikTok 这片充满机遇的流量蓝海&#xff0c;正吸引着无数创业者和品牌方争相角逐。而要想在这激烈的竞争中脱颖而出&#xff0c;TikTok 矩阵运营无疑是至关重要的制胜法宝。今天&#xff0c;就给大家送上这份超实用的新手实操教程&…

使用DeepSeek协助恢复历史数据

最近&#xff0c;工作中遇到比较老的数据库备份文件数据恢复的问题。过程中使用DeepSeek分析&#xff0c;很快的解决了从除备份文件本身其他信息一概不知的条件下&#xff0c;数据库选型问题和环境搭建问题。下面把实施过程分享出来&#xff0c;给其他遇到相同问题的小伙伴提供…

【特殊场景应对6】频繁跳槽:行业特性与稳定性危机的解释边界

写在最前 作为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算有用,大家基本都能拿到想要的offe…

企业智能化第一步:用「Deepseek+自动化」打造企业资源管理的智能中枢

随着Deepseek乃至AI人工智能技术在企业中得到了广泛的关注和使用&#xff0c;多数企业开始了AI探索之旅&#xff0c;迅易科技也不例外&#xff0c;且在不断地实践中强化了AI智能应用创新的强大能力。 为解决企业知识管理碎片化、提高内部工作效率等问题&#xff0c;迅易将目光放…

大连理工大学选修课——图形学:第三四章 基本图形生成算法

第三四章 基本图形生成算法 图形生成 概念&#xff1a;如何在指定的输出设备上&#xff0c;根据坐标描述&#xff0c;构造基本二维几何图形 基本二维几何图形&#xff1a;点、直线、圆、多边形域、字符串及相关属性等。 图形生成的概念 是在指定的输出设备上&#xff0c;根…