【消息队列开发】 实现消息删除逻辑

文章目录

  • 🍃前言
  • 🌲实现步骤
    • 🚩检验参数的合法性
    • 🚩读取Message数据
    • 🚩二进制转为message
    • 🚩isValid 设置为无效
    • 🚩写入文件
    • 🚩更新统计文件
    • 🚩特别注意
    • 🚩完整代码
  • ⭕总结

🍃前言

本次开发目标

  • 实现消息删除逻辑

也就是将Massage对象的isValid字段设置为0x0

🌲实现步骤

实现该逻辑我们可以分为以下6步

🚩检验参数的合法性

我们需要检查一下当前要写入的队列对应的文件是否存在.

不合法的话,抛出我们的自定义异常
在这里插入图片描述

🚩读取Message数据

我们要对Message对象进行修改,首先就需要将相应的Message读取出来

但是我们之前使用的FilelnputStream 和 FileOutputStream 都是从文件头读写的。

而我们此处需要的是,在文件的指定位置进行读写,随机访问

所以此处使用到的类为:RandomAccessFile

在该类中,我们可以使用以下方法进行读取

  • read:读
  • write:写
  • seek:调整当前的文件光标(当前读写文件的位置)

seek可以使文件光标移动,read 和 write 本身也会引起光标移动

如此以来我们就可以进行读取了,我们创建一个byte类型的数组,数组大小为我们存储在内存中的message对象。

message.getOffsetEnd() - message.getOffsetBeg()

然后使用seek方法将光标调至 该message 的起始位置

然后进行读取
在这里插入图片描述

🚩二进制转为message

当前读出来的数据还是二进制的,我们要对它进行反序列转成Message对象
在这里插入图片描述

🚩isValid 设置为无效

这里只需要设置硬盘中的数据就好
在这里插入图片描述

🚩写入文件

该操作分为三步

  1. 将新设置好的对象序列化
  2. 调整光标至该消息的起始位置
  3. 写入数据

在这里插入图片描述

🚩更新统计文件

不要忘了, 更新统计文件!! 把一个消息设为无效了, 此时有效消息个数就需要 - 1

在这里插入图片描述

🚩特别注意

我们这个操作依旧是存在线程安全问题的,所以依旧需要进行加锁操作

🚩完整代码

// 这里的删除是逻辑删除, 也就是把硬盘上存储的这个数据里面的那个 isValid 属性, 设置成 0
// 1. 先把文件中的这一段数据, 读出来, 还原回 Message 对象;
// 2. 把 isValid 改成 0;
// 3. 把上述数据重新写回到文件.
// 此处这个参数中的 message 对象, 必须得包含有效的 offsetBeg 和 offsetEnd
public void deleteMessage(MSGQueue queue, Message message) throws IOException, ClassNotFoundException, MqException {// 1. 检查一下当前要写入的队列对应的文件是否存在.if (!checkFilesExits(queue.getName())) {throw new MqException("[MessageFileManager] 队列对应的文件不存在! queueName=" + queue.getName());}synchronized (queue) {try (RandomAccessFile randomAccessFile = new RandomAccessFile(getQueueDataPath(queue.getName()), "rw")) {// 2. 从文件中读取对应的 Message 数据.byte[] bufferSrc = new byte[(int) (message.getOffsetEnd() - message.getOffsetBeg())];randomAccessFile.seek(message.getOffsetBeg());randomAccessFile.read(bufferSrc);// 3. 把当前读出来的二进制数据, 转换回成 Message 对象Message diskMessage = (Message) BinaryTool.fromBytes(bufferSrc);// 4. 把 isValid 设置为无效.diskMessage.setIsValid((byte) 0x0);// 此处不需要给参数的这个 message 的 isValid 设为 0, 因为这个参数代表的是内存中管理的 Message 对象// 而这个对象马上也要被从内存中销毁了.// 5. 重新写入文件byte[] bufferDest = BinaryTool.toBytes(diskMessage);// 虽然上面已经 seek 过了, 但是上面 seek 完了之后, 进行了读操作, 这一读, 就导致, 文件光标往后移动, 移动到// 下一个消息的位置了. 因此要想让接下来的写入, 能够刚好写回到之前的位置, 就需要重新调整文件光标.randomAccessFile.seek(message.getOffsetBeg());randomAccessFile.write(bufferDest);// 通过上述这通折腾, 对于文件来说, 只是有一个字节发生改变而已了~~}// 6.不要忘了, 更新统计文件!! 把一个消息设为无效了, 此时有效消息个数就需要 - 1Stat stat = readStat(queue.getName());if (stat.validCount > 0) {stat.validCount -= 1;}writeStat(queue.getName(), stat);}
}

⭕总结

关于《【消息队列开发】 实现消息删除逻辑》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下

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

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

相关文章

运动想象 (MI) 迁移学习系列 (9) : 数据对齐(EA)

运动想象迁移学习系列:数据对齐(EA) 0. 引言1. 迁移学习算法流程2. 欧式对齐算法流程3. 与RA算法进行对比4. 实验结果对比5. 总结欢迎来稿 论文地址:https://ieeexplore.ieee.org/abstract/document/8701679 论文题目:Transfer Le…

【论文阅读】MoCoGAN: Decomposing Motion and Content for Video Generation

MoCoGAN: Decomposing Motion and Content for Video Generation 引用: Tulyakov S, Liu M Y, Yang X, et al. Mocogan: Decomposing motion and content for video generation[C]//Proceedings of the IEEE conference on computer vision and pattern recognitio…

vscode-server的搭建方法

一、配置服务器端口支持 1、开放端口: 2、关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.service二、配置code-server到服务器上** 1、下载code-server-4.22.0-linux-amd64.tar.gz到本地(可下载最新的版本)&a…

几何相互作用GNN预测3D-PLA

预测PLA是药物发现中的核心问题。最近的进展显示了将ML应用于PLA预测的巨大潜力。然而,它们大多忽略了复合物的3D结构和蛋白质与配体之间的物理相互作用,而这对于理解结合机制至关重要。作者提出了一种结合3D结构和物理相互作用的几何相互作用图神经网络GIGN,用于预测蛋白质…

CV论文--2024.3.15

1、FastMAC: Stochastic Spectral Sampling of Correspondence Graph 中文标题:FastMAC: 随机谱采样对应关系图 简介:在计算机视觉中,3D对应关系是指一对3D点,构成了基本概念。一组具有兼容边的3D对应关系形成了对应关系图&#…

openssh漏洞升级版本9.4.1p

服务器在做漏扫时发现openssh有几个高危漏洞,现在需要将openssh版本升级到9.4p1 查看openssh版本号 ssh -V 环境准备下载相关依赖和命令 yum install wget gcc openssl-devel pam-devel rpm-build zlib-devel -y 现有openssl1.0.2k升级openssl到1.1.1t 下载安装包 w…

COX回归影响因素分析的基本过程与方法

在科学研究中,经常遇到分类的结局,主要是二分类结局(阴性/阳性;生存/死亡),研究者可以通过logistic回归来探讨影响结局的因素,但很多时候logistic回归方法无法使用。如比较两种手段治疗新冠肺炎…

【Python数据结构与判断7/7】数据结构小结

目录 序言 整体回忆 定义方式 访问元素 访问单个元素 访问多个与元素 修改元素 添加元素 列表里添加元素 字典里添加元素 删除元素 in运算符 实战案例 总结 序言 今天将对前面学过的三种数据结构:元组(tuple)、列表(…

深度学习环境搭建

前言 因为一些原因,我需要更换一台新的服务器来跑深度学习。 这篇文章记录了我在新的远程服务器上搭建深度学习环境的过程。 基本情况 本人采用笔记本电脑连接远程服务器的方式跑深度学习代码。 笔记本电脑环境: 远程服务器环境: 环境搭…

使用 ChatGPT 写高考作文

写作文,很简单,但写一篇好的作文,是非常有难度的。 想要写一篇高分作文,需要对作文题目有正确的理解,需要展现独到的观点和深入的思考,需要具备清晰的逻辑结构,需要准确而得体的语言表达。 正…

macOS Ventura 13.6.5 (22G621) Boot ISO 原版可引导镜像下载

macOS Ventura 13.6.5 (22G621) Boot ISO 原版可引导镜像下载 3 月 8 日凌晨,macOS Sonoma 14.4 发布,同时带来了 macOS Ventru 13.6.5 和 macOS Monterey 12.7.4 安全更新。 macOS Ventura 13.6 及更新版本,如无特殊说明皆为安全更新&…

【数学】【计算几何】1453. 圆形靶内的最大飞镖数量

作者推荐 视频算法专题 本文涉及知识点 数学 计算几何 LeetCoce:1453. 圆形靶内的最大飞镖数量 Alice 向一面非常大的墙上掷出 n 支飞镖。给你一个数组 darts ,其中 darts[i] [xi, yi] 表示 Alice 掷出的第 i 支飞镖落在墙上的位置。 Bob 知道墙上所有 n 支飞…