Vue中如何进行分布式任务调度与定时任务管理

news2024/11/17 13:46:37

在Vue中进行分布式任务调度与定时任务管理

分布式任务调度和定时任务管理是许多应用程序中的关键功能之一。它们用于执行周期性的、异步的、重复的任务,例如数据备份、邮件发送、定时报告生成等。在Vue.js应用中,我们可以结合后端服务实现分布式任务调度和定时任务管理,以提高应用程序的可靠性和效率。本文将介绍如何在Vue中进行分布式任务调度与定时任务管理,并提供相关代码示例。

在这里插入图片描述

准备工作

在开始之前,请确保您已经安装了Node.js和Vue CLI。如果尚未安装,您可以按照Vue CLI官方文档的说明进行安装。

# 安装Vue CLI
npm install -g @vue/cli

此外,我们将使用Redis作为任务队列来存储和管理任务,因此您需要安装并启动Redis服务器。您可以从Redis官网下载和安装Redis。

创建Vue项目

首先,让我们创建一个新的Vue项目。在终端中执行以下命令:

vue create task-scheduler-app

在项目创建过程中,您可以选择自定义配置或使用默认配置,具体根据您的需求来选择。创建完成后,进入项目目录:

cd task-scheduler-app

安装后端服务

为了实现分布式任务调度和定时任务管理,我们需要一个后端服务来处理任务的存储和调度。在这里,我们将使用Node.js和Express来创建一个简单的后端服务。

首先,在项目根目录中创建一个名为server的文件夹,并在其中创建一个名为app.js的文件:

mkdir server
touch server/app.js

然后,使用以下代码创建后端服务:

// server/app.js
const express = require('express');
const redis = require('redis');
const { promisify } = require('util');
const cors = require('cors');

const app = express();
const port = process.env.PORT || 3000;
const client = redis.createClient();

const getAsync = promisify(client.get).bind(client);
const zrangeAsync = promisify(client.zrange).bind(client);

app.use(cors());
app.use(express.json());

app.post('/schedule', async (req, res) => {
  const { taskId, scheduleTime } = req.body;
  const currentTime = Date.now();

  if (scheduleTime <= currentTime) {
    return res.status(400).json({ message: 'Invalid schedule time' });
  }

  await client.zadd('tasks', scheduleTime, taskId);
  return res.json({ message: 'Task scheduled' });
});

app.get('/tasks', async (req, res) => {
  const currentTime = Date.now();
  const taskIds = await zrangeAsync('tasks', 0, -1);

  const tasks = await Promise.all(
    taskIds.map(async (taskId) => {
      const scheduleTime = await getAsync(taskId);
      return { taskId, scheduleTime };
    })
  );

  res.json(tasks.filter((task) => task.scheduleTime > currentTime));
});

app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

上述代码创建了一个简单的Express应用,它提供了两个API端点:

  1. POST /schedule:用于将任务安排到指定的时间。
  2. GET /tasks:用于获取当前待执行的任务列表。

该应用还使用了Redis来存储任务和其计划执行时间。

创建任务调度器组件

现在,让我们创建一个名为TaskScheduler.vue的Vue组件,该组件用于调度任务并显示任务列表。

<template>
  <div>
    <h1>任务调度器</h1>
    <div>
      <label for="taskId">任务 ID:</label>
      <input type="text" id="taskId" v-model="taskId" />
    </div>
    <div>
      <label for="scheduleTime">计划时间:</label>
      <input type="datetime-local" id="scheduleTime" v-model="scheduleTime" />
    </div>
    <button @click="scheduleTask">调度任务</button>
    <h2>待执行任务列表</h2>
    <ul>
      <li v-for="task in tasks" :key="task.taskId">
        <span>ID: {{ task.taskId }}</span>
        <span>计划时间: {{ new Date(task.scheduleTime).toLocaleString() }}</span>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      taskId: '',
      scheduleTime: '',
      tasks: [],
    };
  },
  methods: {
    async scheduleTask() {
      try {
        const response = await fetch('http://localhost:3000/schedule', {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json',
          },
          body: JSON.stringify({
            taskId: this.taskId,
            scheduleTime: new Date(this.scheduleTime).getTime(),
          }),
        });

        if (response.ok) {
          this.taskId = '';
          this.scheduleTime = '';
          this.fetchTasks();
        } else {
          const data = await response.json();
          console.error(data.message);
        }
      } catch (error) {
        console.error('调度任务失败:', error);
      }
    },
    async fetchTasks() {
      try {
        const response = await fetch('http://localhost:3000/tasks');
        if (response.ok) {
          this.tasks = await response.json();
        }
      } catch (error) {
        console.error('获取任务列表失败:', error);
      }
    },
  },
  created() {
    this.fetchTasks();
  },
};
</script>

上述代码创建了一个名为TaskScheduler.vue的Vue组件,该组件包括以下功能:

  • 输入任务ID和计划时间,并通过按钮点击将任务调度到指定时间。
  • 显示当前待执行的任务列表。

集成组件

最后,我们需要将TaskScheduler.vue组件

集成到我们的Vue应用中。打开src/App.vue文件,并在其中添加以下代码:

<template>
  <div id="app">
    <TaskScheduler />
  </div>
</template>

<script>
import TaskScheduler from './components/TaskScheduler.vue';

export default {
  name: 'App',
  components: {
    TaskScheduler,
  },
};
</script>

这样,我们的任务调度器组件就被添加到了Vue应用的根组件中。

运行应用程序

现在,我们可以运行应用程序并查看任务调度与定时任务管理功能。在项目根目录中执行以下命令:

npm run serve

打开浏览器并访问http://localhost:8080,您将看到一个简单的任务调度器界面,您可以输入任务ID和计划时间,然后点击按钮将任务调度到指定时间。待执行的任务列表将显示在页面上。

进一步探索

这只是一个简单的分布式任务调度和定时任务管理示例,您可以根据您的需求扩展和改进它。例如,您可以添加任务执行、任务取消、任务重试等功能,以满足不同应用场景的需求。

总结

在Vue.js中进行分布式任务调度与定时任务管理是一个重要的功能,它可以使您的应用程序更加可靠和高效。通过结合Vue.js前端和Node.js后端,以及使用Redis作为任务队列,我们已经成功地创建了一个简单的任务调度器示例。希望本文对您有所帮助,并激发了您在Vue应用中探索任务调度与定时任务管理的兴趣。如果您有任何问题或需要进一步的帮助,请随时提问。

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

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

相关文章

浏览器技巧:谷歌浏览器六个实用设置小技巧,值得收藏

目录 1、确保你的浏览器启用标准保护选项 2、使用安全DNS&#xff08;DNS over HTTPS&#xff09; 3、网站通知修改为"静态指示方式" 4、启用页面预加载提升网页加载速度 5、阻止Chrome浏览器在后台运行 6. 更改 Chrome 启动后打开方式为"上次打开的网页&…

javaWeb超市订单管理系统

一、引言 超市管理系统(smbms)作为每个计算机专业的大学生都是一个很好的练手项目&#xff0c;逻辑层次分明&#xff0c;基础功能包括用户的登录和注销&#xff0c;用户和供应商以及订单信息的增删查改的基础功能。可以帮助我们更好的加深理解三层架构的理念&#xff0c;本项目…

复习 --- QT服务器客户端

服务器&#xff1a; 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer> #include<QTcpSocket> #include<QMessageBox> #include<QDebug> #include<QList> #include<QListWidget> #in…

电脑数据恢复怎么操作?电脑数据恢复难点是什么

随着电脑在我们日常生活中的普及&#xff0c;数据的重要性不言而喻。然而&#xff0c;在某些情况下&#xff0c;我们可能会不小心删除或因其他原因导致丢失了重要的电脑数据&#xff0c;这时候就需要进行数据恢复操作。下面我们一起来了解下电脑数据恢复的操作方法&#xff0c;…

【全3D打印坦克——基于Arduino履带式机器人】

【全3D打印坦克——基于Arduino履带式机器人】 1. 概述2. 设计机器人平台3. 3D 模型和 STL 下载文件3.1 3D打印3.2 组装 3D 打印坦克 – 履带式机器人平台3.3 零件清单 4. 机器人平台电路图4.1 定制电路板设计4.2 完成 3D 打印储罐组件 5. 机器人平台编程6. 测试3D打印机器人 -…

侯捷 C++ STL标准库和泛型编程【C++学习笔记】 超详细 万字笔记总结 笔记合集

关于STL这部分&#xff0c;原课程将其分为了四部分&#xff0c;我做笔记时&#xff0c;会将其整合&#xff0c;使其更具有整体性 文章目录 1 STL概述1.1 头文件名称1.2 STL基础介绍1.3 typename 2 OOP vs. GP3 容器3.1 容器结构分类3.2 序列式容器3.2.1 array测试深度探索 3.2.…

Python3操作MongoDb7最新版创建文档及CRUD基本操作

Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 Python3数据科学包系列(三):数据分析实战 MongoDB 操作手册----文档…

Zookeeper经典应用场景实战(一)

文章目录 1、Zookeeper Java客户端实战1.1、 Zookeeper 原生Java客户端使用1.2、 Curator开源客户端使用 2、 Zookeeper在分布式命名服务中的实战2.1、 分布式API目录2.2、 分布式节点的命名2.3、 分布式的ID生成器 3、Zookeeper实现分布式队列3.1、 设计思路3.2、 使用Apache …

电脑桌面黑屏,但程序还可以正常运行

问题&#xff1a;桌面黑屏&#xff0c;程序可以正常运行操作 解决方法: 1.Ctrl Alt Del 2.点击 【任务管理器】-->【文件F】-->【运行新任务N】 3.输入 explorer.exe 回车

Docker 镜像的缓存特性

Author&#xff1a;rab 目录 前言一、构建缓存二、Pull 缓存总结 前言 首先我们要清楚&#xff0c;Docker 的镜像结构是分层的&#xff0c;镜像本身是只读的&#xff08;不管任何一层&#xff09;&#xff0c;当我们基于某镜像运行一个容器时&#xff0c;会有一个新的可写层被…

Spring的AOP开发-注解方式开发AOP

基于注解配置的AOP 注解方式AOP的基本使用 Spring的AOP也提供了注解方式配置&#xff0c;使用相应的注解替代之前的xml配置&#xff0c;xml配置AOP时&#xff0c;我们主要配置了三部分&#xff1a;目标类被Spring容器管理&#xff08;注解使用Service&#xff09;、通知类被S…

图像和视频上传平台Share Me

本文完成于 6 月&#xff0c;所以反代中&#xff0c;域名演示还是使用的 laosu.ml&#xff0c;不过版本并没有什么变化&#xff1b; 什么是 Share Me &#xff1f; Share Me 是使用 Next.js 和 PocketBase 的自托管图像和视频上传平台&#xff0c;具有丰富的嵌入支持和 API&…

基于Java的高校宿舍管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

【C++】unordered_map和unordered_set

哈希表 1. unordered_map1.1 概念1.2 常见接口 2. unordered_set2.1 概念2.1 常见接口 3. 底层实现3.1 哈希3.2 哈希函数3.3 闭散列和开散列3.3.1 闭散列3.3.2 开散列 3.4 模拟实现3.4.1 改造哈希桶3.4.2 模拟实现unordered_set3.4.3 模拟实现unordered_map 在C11中&#xff0c…

Promise, async, await 学习

异步编程简介&#xff1a; 介绍&#xff1a;异步编程是一种编程范式&#xff0c;旨在提高程序的性能和响应能力。该模型允许程序在执行某些任务时&#xff0c;不必等待这些任务完成就可以进行下一步操作&#xff0c;从而提高了程序的效率。 作用&#xff1a;异步编程通常用于…

IPT2602协议-USB 快速充电端口控制器

产品描述&#xff1a; IPT2602是一款USB端口快速充电协议控制芯片。IPT2602智能识别多种快速充电协议&#xff0c;对手机等受电设备进行快速充电。IPT2602根据受电设备发送的电压请求能够精确的调整VBUS输出电压&#xff0c;从而实现快速充电。 IPT2602在调整5V输出电压前会自动…

10.5 认识XEDParse汇编引擎

XEDParse 是一款开源的x86指令编码库&#xff0c;该库用于将MASM语法的汇编指令级转换为对等的机器码&#xff0c;并以XED格式输出&#xff0c;目前该库支持x86、x64平台下的汇编编码&#xff0c;XEDParse的特点是高效、准确、易于使用&#xff0c;它可以良好地处理各种类型的指…

[硬件基础]-快速了解RS232串行通信

快速了解RS232串行通信 文章目录 快速了解RS232串行通信1、概述2、什么是串行数据通信&#xff1f;3、什么是RS232&#xff1f;4、RS232应用5、RS232如何工作&#xff1f;6、RS232协议基础6.1 电压与逻辑表示6.2 数据编码6.3 起始位和停止位6.4 奇偶校验位6.5 波特率6.5 RS232电…

掌握 SwiftUI 中的 ScrollView

文章目录 前言scrollTransition 修饰符ScrollTransitionPhase弹性动画总结 前言 SwiftUI 框架的第五个版本引入了许多与 ScrollView 相关的新 API&#xff0c;使其比以前更强大。本周将开始介绍 ScrollView 在 SwiftUI 中的新功能系列文章&#xff0c;首先我们将讨论滚动过渡。…

【LeetCode: 918. 环形子数组的最大和 | 动态规划】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…