Vue前端实现一个本地消息队列(MQ), 让消息延迟消费或者做缓存

MQ功能实现的具体代码(TsMQ.ts):

import { v4 as uuidx } from 'uuid';import emitter from '@/utils/mitt'class Message {// 过期时间,0表示马上就消费exp: number;// 消费标识,避免重复消费tag : string;// 消息体body : any;constructor( exp: number ,  body : any ) {if (exp == 0) {this.exp = 0;}else {this.exp = Date.now().valueOf() + exp;}this.body = body;this.tag = uuidx();}}export default class TsMQ {static tsMQ : TsMQ;repository : Map<string, any[]>;/*获取单列的MQ对象*/static getInstance() : TsMQ {if(this.tsMQ == null) {this.tsMQ = new TsMQ();}return this.tsMQ;}constructor() {this.repository = new Map<string,any[]>();// 把消息放入Mitt进行推送setInterval(()=> {Array.from(this.repository.keys()).forEach( key => {let poll = this.repository.get(key) as any[];if(poll.length > 0) {poll.forEach( item => {if (item.exp == 0 || item.exp <= Date.now().valueOf() - 100) {emitter.emit(key,item.body);let single : any[] = this.repository.get(key) as any[];single = single.filter(dispose => {return dispose.tag !== item.tag;});this.repository.set(key,single);}});}});},100)}/** @describe 放消息入队列* @param queue : string 队列名称* @param exp : number 消息消费时间* @param  message : any 消息体*/pushMessage( queue : string , exp : number,  message : any ) {if(this.repository.has(queue)) {let single : any[] = this.repository.get(queue) as any[];single.push(new Message(exp,message));this.repository.set(queue,single);}else {let temp = [];temp.push(new Message(exp,message));this.repository.set(queue,temp);}}/** 直接获取消息,可以配合做本地缓存* 就要去掉constructor的轮询推送*/takeMessage( queue : string ) : any {let single : any[] = this.repository.get(queue) as any[];if( single && single.length > 0) {let message = single.shift();this.repository.set(queue,single);return message;}else {return '队列没有消息!';}}}
提示:其中需要用到三方的uuid和mitt,然后要消息持久化可以用到pinia来让消息持久化,本案列没有采用持久化

uuid的三方包安装命令

npm install uuid

使用方式:

<script setup lang="ts">import TsMQ from '@/utils/TsMQ'import emitter from '@/utils/mitt'let tsMQ : TsMQ = TsMQ.getInstance();//订阅消息emitter.on("HelloWord",e => {console.log(`收到消息:${JSON.stringify(e)}\n消息时间:${new Date().toLocaleString()}`)})//投送消息function tsMQs() {console.log(`M2投递时间:${new Date().toLocaleString()}`)tsMQ.pushMessage("HelloWord",1000 * 20,{ name : 'M2', second:20 });tsMQ.pushMessage("HelloWord",1000 * 3,{ name : 'M1', second:3 });// MQ功能实现的具体代码,提示:其中需要用到三方的uuid和mitt,然后要消息持久化可以用到pinia来让消息持久化,本案列没有采用持久化}function takeMQs() {console.log(tsMQ.takeMessage('1'));}</script><template><div id="app" style="display: flex;flex-direction: column;justify-content: center;height: 100%;width: 100%;margin: 0;padding: 0"><span @click="tsMQs">MQ投送</span><span @click="takeMQs">MQ获取</span></div>
</template><style scoped></style>

效果:

总结:我们可以看到我们实现了这个功能 ,其中可以用来作为缓存使用,同理可写

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

学习磁盘管理

文章目录 一、磁盘接口类型二、磁盘设备的命名三、fdisk分区四、自动挂载五、扩容swap六、GPT分区七、逻辑卷管理八、磁盘配额九、RAID十、软硬链接 一、磁盘接口类型 IDE、SATA、SCSI、SAS、FC&#xff08;光纤通道&#xff09; IDE, 该接口是并口。SATA, 该接口是串口。SCS…

LeetCode刷题---确认率

解题思路: 将Signups和Confirmations进行左连接&#xff0c;连接的条件为Signups.user_idConfirmations.user_id 根据题中要求进行查询&#xff0c;这里使用AVG聚合函数来求解确认率 AVG(c.action‘confirmed’)表示对action列进行求平均&#xff0c;如果action‘confirmed’&a…

Atcoder ABC341 E - Alternating String

Alternating String&#xff08;交替字符串&#xff09; 时间限制&#xff1a;3s 内存限制&#xff1a;1024MB 【原题地址】 所有图片源自Atcoder&#xff0c;题目译文源自脚本Atcoder Better! 点击此处跳转至原题 【问题描述】 【输入格式】 每个查询 q u e r y i query…

【论文笔记之 YIN】YIN, a fundamental frequency estimator for speech and music

本文对 Alain de Cheveigne 等人于 2002 年在 The Journal of the Acoustical Society of America 上发表的论文进行简单地翻译。如有表述不当之处欢迎批评指正。欢迎任何形式的转载&#xff0c;但请务必注明出处。 论文链接&#xff1a;http://audition.ens.fr/adc/pdf/2002_…

C语言:数组指针 函数指针

C语言&#xff1a;数组指针 & 函数指针 数组指针数组名 数组访问二维数组 函数指针函数指针使用回调函数 typedef关键字 数组指针 数组本质上也是一个变量&#xff0c;那么数组也有自己的地址&#xff0c;指向整个数组的指针&#xff0c;就叫做数组指针。 我先为大家展示…

详解POCV/SOCV的时序报告

​POCV/SOCV的时序报告中有如下变量&#xff1a; Mean: 高斯分布中的μ值&#xff08;平均值&#xff09; Sensit: sensitivity&#xff0c;也就是1个Sigma的值&#xff1b; Corner: Sigma边界的最差值 cell的delay Delay mean N * Delay sigma; cell 的Transition Sl…

【简写Mybatis】02-注册机的实现以及SqlSession处理

前言 注意&#xff1a; 学习源码一定一定不要太关注代码的编写&#xff0c;而是注意代码实现思想&#xff1a; 通过设问方式来体现代码中的思想&#xff1b;方法&#xff1a;5W1H 源代码&#xff1a;https://gitee.com/xbhog/mybatis-xbhog&#xff1b;https://github.com/xbh…

vs+qt实现摄像头开启以及拍照功能

无标题 开启摄像头三步走第一步UI界面&#xff0c;自己画的第二步 定义对象第三步 实现功能 后面还有踩得坑记录一下。。。关于UI对象的定义关于使用摄像头前提准备 开启摄像头三步走 第一步UI界面&#xff0c;自己画的 第二步 定义对象 一个UI 一个摄像头 一个用来显示摄像头…

NUS神经网络生成我感觉解读过于夸大了

网上对其解读有点过了&#xff0c;只是合成了最后标准化层的参数&#xff0c;或者是更多的其他层参数。而不是网络结构。对于新任务下的网络结构以及参数如何生成&#xff0c;应该是做不到的&#xff0c;论文意义有限。 论文片段&#xff1a;我们提出了神经网络扩散&#xff0…

GOLANG开发 - Echo 框架 入门

好久没有更新过了&#xff0c;今年年底特别的忙&#xff0c;不知道为啥&#xff0c;太忙了简直&#xff0c;抽空出来赶紧更新一篇关于golang的文章&#xff0c;本次主将的是即Gin框架和Beego框架之后的有一个框架&#xff0c;叫 Echo框架 学习过PHP的同学肯定对这个词不陌生&am…

2步破解官方sublime4

sublime简要破解流程 1.下载sublime官方最新版2. 破解流程 1.下载sublime官方最新版 打开 官方网站下载 portable version 版&#xff0c;省的安装。。解压到任意位置&#xff0c;备份 sublime_text.exe 文件 2. 破解流程 打开网址把文件 sublime_text.exe 拖入网页搜索替换…

Android之UI Automator框架源码分析(第九篇:UiDevice获取UiAutomation对象的过程分析)

前言 通过UiDevice的构造方法&#xff0c;UiDevice对象持有的几个对象一部分是在构造方法中创建的&#xff08;初始化&#xff09;&#xff0c;它持有的每个对象都是分析的重点 备注&#xff1a;当前对象持有的对象&#xff0c;它的位置一般在实例变量创建时或者构造方法中&…

node14下运行项目报错:regeneratorRuntime is not defined

regeneratorRuntime is not defined&#xff0c;这是由于配置babel出错问题&#xff0c;由于使用了es7语法如async/await而当前babel版本过低 解决&#xff1a; npm install -D babel-plugin-transform-runtime babel-runtime 安装完成后在.babelrc文件下配置&#xff1a; &qu…

矢量图绘制软件:EazyDraw for Mac v11.6.0中文版

EazyDraw是一款功能强大的矢量绘图软件&#xff0c;适用于Mac平台。它提供了直观易用的工具和功能&#xff0c;方便用户进行各种类型的绘图工作&#xff0c;包括插图、图表、技术绘图、流程图、CAD图纸等。 EazyDraw具有丰富的绘图工具&#xff0c;包括线条、多边形、文本、图像…

springboot-基础-eclipse配置+helloword示例

备份笔记。所有代码都是2019年测试通过的&#xff0c;如有问题请自行搜索解决&#xff01; 目录 配置helloword示例新建项目创建文件 配置 spring boot官方有定制版eclipse&#xff0c;也就是STS&#xff0c;因为不想再装&#xff0c;所以考虑eclipse插件安装jdk和eclipse安装…

人脸2D和3D道具SDK解决方案提供商

人脸识别和增强现实技术成为了许多企业和开发者关注的焦点&#xff0c;为了满足市场对高质量、易于集成的人脸识别SDK的需求&#xff0c;美摄科技推出了一系列领先的人脸2D/3D道具SDK解决方案。 一、产品特点 高精度识别&#xff1a;美摄科技的人脸识别技术采用深度学习算法&…

贝叶斯核机器回归拓展R包:bkmrhat

1.摘要 bkmrhat包是用于扩展bkmr包的贝叶斯核机器回归&#xff08;Bayesian Kernel Machine Regression, BKMR&#xff09;分析工具&#xff0c;支持多链推断和诊断。该包利用future, rstan, 和coda包的功能&#xff0c;提供了在贝叶斯半参数广义线性模型下进行identity链接和 …

企业想要高效上云?如何实现?

进入数字化、智能化时代以后&#xff0c;企业数字化转型已成为企业发展的必然趋势。浪潮之中&#xff0c;越来越多的企业开始积极探索上云路径&#xff0c;云上创新已经成为企业加速数字化转型&#xff0c;提升竞争力的必经之路。 赞奇与华为携手共创云桌面SaaS产品—赞奇云工作…

【Flutter/Android】新建项目,打开android 目录,报错红色以及开启 MultiDex 配置

1 报错红色问题。 单独打开 Flutter 项目下的 android 项目即可。 也就是说&#xff0c;你要一部分原生代码开发&#xff0c;你就需要自己把 android 项目单独出去做&#xff08;其实就相当于android 项目引用 Flutter的dart部分&#xff09;。也就是说&#xff0c;在 Flutter…

鲲鹏arm64架构下安装KubeSphere

鲲鹏arm64架构下安装KubeSphere 官方参考文档: https://kubesphere.io/zh/docs/quick-start/minimal-kubesphere-on-k8s/ 在Kubernetes基础上最小化安装 KubeSphere 前提条件 官方参考文档: https://kubesphere.io/zh/docs/installing-on-kubernetes/introduction/prerequi…