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

news2025/1/31 2:59:41

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;

    cache : boolean;

    repository : Map<string, any[]>;

    /*
     设置只作为缓存使用
     */
    setCache(cache : boolean)  {
        this.cache = cache;
    }

    /*
      获取单列的MQ对象
     */
    static getInstance() : TsMQ {
        if(this.tsMQ == null) {
            this.tsMQ = new TsMQ();
        }
        return this.tsMQ;
    }

    constructor() {
        this.repository = new Map<string,any[]>();
        this.cache = false;
        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) {
                           // 如果是作为缓存使用就不会放入mitt就行推送
                           if(!this.cache) {
                               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);
        }
    }


    /*
     * @describe 直接获取消息,可以配合做本地缓存,就要去掉constructor的轮询中的事件推送
     * @param queue : string 队列名称
     */
    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
mitt的三方安装命令 
npm install --save mitt 

 其中mitt文件的代码

import mitt from "mitt";

const emitter = mitt();

export default emitter;

使用方式:

投送消息
<script setup lang="ts">
   import TsMQ from '@/utils/TsMQ'
   import emitter from '@/utils/mitt'
   let tsMQ : TsMQ = TsMQ.getInstance();

   //投送消息
   function pushMQs() {
       console.log(`M2投递时间:${new Date().toLocaleString()}`)
       tsMQ.pushMessage("HelloWord",1000 * 20,{ name : 'M2', second:20 });
       tsMQ.pushMessage("HelloWord",1000 * 3,{ name : 'M1', second:3 });
   }



</script>

<template>
  <div id="app" style="display: flex;flex-direction: column;justify-content: center;height: 100%;width: 100%;margin: 0;padding: 0">
    <span @click="pushMQs">MQ投送</span>
  </div>
</template>

提示:这里采用事件模拟投送消息 

 消息订阅代码:
<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 takeMQs() {
       console.log(tsMQ.takeMessage('HelloWord'));
   }


</script>

<template>
  <div id="app" style="display: flex;flex-direction: column;justify-content: center;height: 100%;width: 100%;margin: 0;padding: 0">
    <span @click="takeMQs">MQ获取</span>
  </div>
</template>  

效果:

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

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

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

相关文章

Stable Diffusion 绘画入门教程(webui)-ControlNet(Shuffle)

Shuffle(随机洗牌)&#xff0c;这个预处理器会把参考图的颜色打乱搅拌到一起&#xff0c;然后重新组合的方式重新生成一张图&#xff0c;可以想象出来这是一个整体风格控制的处理器。 那么问题来了&#xff0c;官方为啥会设计个这样的处理器呢&#xff0c;主要是给懒人用的&am…

谷歌发布世界模型,能生成可交互虚拟世界;华为发布全球首个 5.5G 智能核心网丨 RTE 开发者日报 Vol.152

开发者朋友们大家好&#xff1a; 这里是「RTE 开发者日报」&#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

跨越人生的河流,重温读书的时光—社科院与杜兰大学金融管理硕士

我们都曾有过读书的时光&#xff0c;那些曾经的岁月&#xff0c;或许已经远去&#xff0c;但读书带给我们的影响却永远不会消失。它不仅让我们获取了知识&#xff0c;更让我们学会了思考、表达和沟通。这些能力在我们日后的工作和生活中发挥着巨大的作用&#xff0c;让我们更加…

【Android移动开发】Windows10平台安装Android Studio与人工智能算法模型部署案例

目录 一、Android Studio下载地址二、开发环境JDK三、开始安装Android Studio四、案例展示与搭建五、人工智能算法模型移动端部署案例参考 一、Android Studio下载地址 https://developer.android.google.cn/studio/install.html 电脑配置要求&#xff1a; 下载保存在指定文…

【Python笔记-设计模式】命令模式

一、说明 命令模式是一种行为设计模式&#xff0c;旨在对命令的封装&#xff0c;根据不同的请求将方法参数化、延迟请求执行或将其放入队列中&#xff0c;且能实现可撤销操作。 (一) 解决问题 将请求发送者和接受者解耦&#xff0c;请求发送者只需知道如何发送请求&#xff…

P1450 [HAOI2008] 硬币购物 dp 容斥 —— s - c[i]*(d[i]+1)怎么理解

[HAOI2008] 硬币购物 - 洛谷 看了洛谷许多题解&#xff0c;一开始理解不了为什么是 s - c[i]*(d[i]1)&#xff0c;为什么要1呢&#xff1f; 其实是dp理解的不好。 这里的意思就是该枚硬币先超过限制&#xff0c;接下来剩下的背包也要填满&#xff0c;4种硬币随便组合的情况数…

Open CASCADE学习|视图

目录 Mainwin.h Mainwin.cpp Mainwin.h ​#pragma once#include <QtWidgets/QMainWindow>#include "Displaywin.h"#include "OCC.h"class Mainwin : public QMainWindow{ Q_OBJECTpublic: Mainwin(QWidget* parent nullptr); ~Mainwin();​pri…

BTC网络 vs ETH网络

设计理念 BTC 网络 比特币是一种数字货币&#xff0c;旨在作为一种去中心化的、不受政府或金融机构控制的电子货币。其主要目标是实现安全的价值传输和储存&#xff0c;比特币的设计强调去中心化和抗审查。 ETH 网络 以太坊是一个智能合约平台&#xff0c;旨在支持分散的应…

深入探究Nginx的使用方法

目录 引言 一、网络状态页 二、Nginx 第三方模块 三、变量 &#xff08;一&#xff09;内置变量 &#xff08;二&#xff09;自定义变量 四、自定义日志 &#xff08;一&#xff09;有关日志的配置信息 &#xff08;二&#xff09;error日志的设置 1.日志的等级 2.自…

RT-Thread 自动初始化

最近的程序设计中用到了RT-Thread中的自动初始化&#xff0c;用起来也非常容易&#xff0c;一个宏就解决了&#xff0c;但是原理是什么呢&#xff1f;下面我们一起来学习&#xff1a; 1.1、一般情况的初始化调用 一般情况下&#xff0c;系统中的初始化会这样做&#xff0c;应该…

如何使用 OpenAI Sora?

Sora - 探索AI视频模型的无限可能 OpenAI 的最新项目名为 Sora&#xff0c;这是一个强大的文本到视频模型&#xff0c;可以根据简单的文本提示生成令人兴奋的视频。这个尖端的人工智能模型允许用户描述一个场景&#xff0c;例如“卡通袋鼠跳迪斯科舞”&#xff0c;Sora将生成与…

交叉编译qt到arm平台

使用pkg-config命令查看xxx包是否存在&#xff1a; pkg-config --print-errors xxx pkg-config的搜索路径可以通过环境变量PKG_CONFIG_PATH指定。需要在运行./configure 之前指定。 ./configure -release -qt-libjpeg -qt-libpng -qt-zlib -qt-pcre -xplatform linux-aarch64-…

主机字节序与网络字节序

大端序和小端序 大端序&#xff08;Big Endian&#xff09;和小端序&#xff08;Little Endian&#xff09;是两种计算机存储数据的方式。 大端序指的是将数据的高位字节存储在内存的低地址处&#xff0c;而将低位字节存储在内存的高地址处。这类似于我们阅读多位数时从左往右…

【HarmonyOS】鸿蒙开发之Stage模型-应用配置文件——第4.2章

Stage模型-应用配置文件 AppScope -> app.json5&#xff1a;应用的全局配置信息entry&#xff1a;OpenHarmony工程模块&#xff0c;编译构建生成一个HAP包 build&#xff1a;用于存放OpenHarmony编译生成的hap包src -> main -> ets&#xff1a;用于存放ArkTS源码src …

kubectl 命令行管理K8S(上)

目录 陈述式资源管理方式 介绍 命令 项目的生命周期 创建 kubectl create命令 发布 kubectl expose命令 更新 kubectl set 回滚 kubectl rollout 删除 kubectl delete 应用发布策略 金丝雀发布 陈述式资源管理方式 介绍 1.kubernetes 集群管理集群资源…

Magento2常见表的作用

1.sales_sequence_profile 更改订单号或者发票号的前缀及最大值

YOLOv6代码解读[01] readme解读

文章目录 模型指标安装训练单GPU多GPU断点续练评估推断部署教程模型指标

Python--界面UI控制,模拟键鼠操作的模块pyautogui(超详细用法)

一、简介 PyAutoGUI是一个Python 第三方库&#xff0c;需要pip install 安装 。它允许我们通过编程方式模拟鼠标和键盘的操作&#xff0c;窗口操作&#xff0c;以及界面的截图匹配。由于它是照搬人的操作&#xff0c;底层没有套牢在Windows系统&#xff0c;所以它可以跨平台。…

韩国突发:将批准比特币ETF

作者&#xff1a;秦晋 韩国两党宣布将批准比特币ETF。比特币也再次成为竞选的宠儿。 4月10日&#xff0c;韩国将迎来每隔4年而进行的一次立法大选。在大选之前&#xff0c;现执政党与反对党都承诺将批准比特币ETF。 我们知道&#xff0c;比特币的主要受众群体以年轻人居多。此前…

Vulnhub靶机网卡启动失败(Raise network interfaces)

完整版见个人博客&#xff1a;xzajyjs.cn 问题 使用一些Linux靶机进行搭建后可能会出现无法搜索到IP的情况&#xff0c;并且会在系统启动时报错&#xff0c;类似下图所示 这个主要是因为vulnhub上的镜像由于搭建环境、版本等问题不适配&#xff0c;网卡没有正确识别导致的&am…