node cron 动态任务调度,不同timeZone配置

2023-10-28

系列文章目录


前言

一、安装cron和timezone

二、创建相关db

1.定时任务开关表

 2.定时任务表和运行记录表

 三、相关代码实现

四、时区数据下载

 五、time cron



前言

使用cron 插件实现动态任务调度,配置不同时区的定时任务


一、安装cron和timezone

npm ininstall cron
npm install moment-timezone

二、创建相关db

1.定时任务开关表

CREATE TABLE `scheduled_task_switch` (
  `id` int(10) NOT NULL,
  `status` tinyint(1) NOT NULL DEFAULT '1',
  `runningState` tinyint(1) DEFAULT '0' COMMENT '0: 初始状态 1:正在停止 2:已停止',
  `createBy` varchar(50) NOT NULL,
  `createDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updateBy` varchar(50) DEFAULT NULL,
  `updateDate` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 2.定时任务表和运行记录表

CREATE TABLE `scheduled_tasks` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `code` varchar(100) DEFAULT NULL,
  `name` varchar(100) NOT NULL,
  `cronTime` varchar(100) DEFAULT NULL,
  `timeZone` varchar(200) DEFAULT NULL,
  `isActive` tinyint(1) NOT NULL DEFAULT '1',
  `limitCount` int(10) DEFAULT NULL,
  `errMaxCount` int(5) DEFAULT '5',
  `saveLog` tinyint(1) DEFAULT '0'45,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4;

CREATE TABLE `scheduled_task_logs` (
  `id` bigint(30) NOT NULL AUTO_INCREMENT,
  `taskId` int(10) NOT NULL,
  `name` varchar(100) DEFAULT NULL,
  `code` varchar(100) DEFAULT NULL,
  `cronTime` varchar(100) DEFAULT NULL,
  `timeZone` varchar(200) DEFAULT NULL,
  `locationDate` datetime DEFAULT NULL,
  `locationWeekDay` tinyint(1) DEFAULT NULL,
  `execCount` int(10) DEFAULT '0',
  `remarks` varchar(2000) DEFAULT NULL,
  `status` tinyint(1) DEFAULT '1',
  `execStatus` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4;

 三、相关代码实现

interface TaskContent {
  taskId: number
  taskCode: string
  taskData: cron.CronJob
  taskInfo: taskDb.ScheduledTasks
}

// 保存已加载的任务
let taskContents: TaskContent[] = []
export const initScheduledTask = (): void => {
  
  const job = new CronJob('0 */1 * * * *', async function () {
    // 获取任务调度总开关
    if (switchStatus === 1) {
       const scheduleTasks: taskDb.ScheduledTasks[] = await taskDb.getScheduledTask()
       for (const task of scheduleTasks) {
          const isActive = task.isActive
          const saveLog = task.saveLog
          const contentIndex = taskContents.findIndex(t => t.taskId === task.id)
          if (contentIndex === -1) { // 不存在
             const taskData = new CronJob(task.cronTime, async function () {
               const timeZoneDate = timeZone.tz(task.timeZone)
               const locationDate = timeZoneDate.format('YYYY-MM-DD HH:mm:ss')
               //根据task code 处理不同的业务逻辑
      
             },null, true, task.timeZone ?? '')
             if (isActive === 1) {
              taskData.start()
            }
            taskContents.push({
              taskId: task.id,
              taskCode: task.code,
              taskData,
              taskInfo: task
            })
          
          } else {
            // 根据task.isActive启动或者暂停相关任务
            taskContents[contentIndex].taskInfo = task
          }
         
       }
    } else {
     if (taskContents.length > 0) {
      for (let i = taskContents.length - 1; i >= 0; i--) {
        const taskData = taskContents[i].taskData
        const taskInfo = taskContents[i].taskInfo
        if (taskData.running) {
           taskData.stop()
           taskContents[i].taskInfo.isActive = 0
        } else {
           // 移除数组中的数据
           taskContents.splice(i, 1)
           // 保存任务记录
           saveLog(taskInfo)
         }
      }
     }else {
      // 修改任务调度状态为已停止
      }
    }
  })
  job.start()
}

四、时区数据下载

Download Time Zone Database - TimeZoneDB

 五、time cron

0 */2 * * * *  每2分钟执行一次

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

node cron 动态任务调度,不同timeZone配置 的相关文章

  • 使用admin sdk在云函数中执行firestore集合组查询?

    firestore collectionGroup 方法在云函数中与 firebase admin sdk 一起使用时出现错误 是否可以在云函数中对 firestore 进行集合组查询 这是我尝试使用的 firestore 查询方法 htt
  • MongoDB,从数组中删除对象

    Doc id 5150a1199fac0e6910000002 name some name items id 23 name item name 23 id 24 name item name 24 有没有办法从数组中提取特定对象 IE
  • 如何在rails中使用npm包?

    我正在尝试使用王牌编辑 https github com ajaxorg ace在我的 Ruby on Rails 应用程序中 大部分视图由 React 组件组成 我正在使用反应轨道宝石 https github com reactjs r
  • 将 html2pdf 生成的 pdf 发送回服务器

    我必须使用以下命令发送客户端生成的 PDFhtml2pdf到服务器 我已成功将生成的 PDF 转换为 base64 并希望使用axios 这是我的客户端代码 function myFunction var element document
  • jasper 报告中的时区转换和日期格式?

    我正在处理 Jasper 报告 我想在其中显示选定的日期范围和时间 我使用以下表达式来格式化日期 但它显示 GMT 时区的时间 new SimpleDateFormat dd MMM yyyy format P START DATE new
  • MySQL+子串怎么做? + 替换?

    我不太擅长 SQL 希望能够变得更好 我在尝试执行某些表操作时遇到一些麻烦 我希望能够从下面的 ProgUID 列中选择子字符串 就像是 SUBSTRING table ProgUID 3 12 这将为我提供 ProgUID P CAMVE
  • Nodejs - 处理和发送多部分请求,

    我的应用程序在 Nodejs 服务器上运行 Node Js 还充当来自应用程序的请求的中间件 代理 因此 从浏览器开始 所有 REST 调用都会转到 NodeJs 然后转到 Java API 我发现处理多部分表单数据的请求时出现问题 我在
  • Angular2 + Laravel 与实时和 WebSockets

    我构建了一个应用程序 并计划与 Angular 2 和 laravel 进行实时战斗 例如 你按下 攻击 按钮 你的对手就会实时看到他的生命在下降 我的应用程序构建有 前端 角2 Backend PHP Laravel 5 2 现在我正在寻
  • 如何使用 Web 套接字和 Angular CLI 设置代理

    我有一个使用 Angular CLI 构建的简单 Web 应用程序 我希望它使用网络套接字与后端通信 我已经编写了后端 并使用一个简单的 index html 页面进行了测试 服务器可以在套接字上发送和接收该页面 在我的 angular c
  • 语法错误:elasticdump 中的exports.runInThisContext (vm.js:53:16) 处出现意外标记 {

    我试图使用elasticdump 将elasticsearch 数据从一台服务器移动到另一台服务器 当我给予 elasticdump input http 192 168 0 122 9200 my index output http lo
  • 使用端口 80 的 AWS Elastic Beanstalk 上的 WebSocket 问题

    我正在将一个 node js 应用程序从 Heroku 迁移到在端口 80 上使用 WebSocket 的 AWS Elastic Beanstalk WebSocket 在 AWS Elastic Beanstalk 上返回 301 错误
  • ActiveRecord3死锁重试

    Rails 3 或 ActiveRecord 3 是否有任何插件可以复制旧版本死锁重试 http agilewebdevelopment com plugins deadlock retry插入 或者 该插件仍然适用于 Rails 3 吗
  • 比较表中的行以了解字段之间的差异

    我有一个包含 20 多列的表 客户端 其中大部分是历史数据 就像是 id clientID field1 field2 etc updateDate 如果我的数据如下所示 10 12 A A 2009 03 01 11 12 A B 200
  • nodejs mocha suite 未定义错误

    我正在尝试使用摩卡运行一些测试 但似乎无法克服这个错误 E tdd nodejs cart gt mocha cart test js node js 201 throw e process nextTick error or err Re
  • 显示表 FULLTEXT 索引列

    我希望运行一个查询 该查询将返回表中全文索引的列列表 该表采用 MyISAM 格式 我将使用 php 来构建查询 理想情况下 我会运行查询 它会返回信息 以便我可以构造一个以逗号分隔的列字符串 例如 名 姓 电子邮箱 这在 MySQL 中可
  • PDO SQLSRV 和 PDO MySQL 在获取 int 或 float 时返回字符串

    当您获取时 PDO MS SQL Server 和 PDO MySQL 都会返回一个字符串数组 即使列的 SQL 类型本应是数字类型 例如 int 或 float 我设法解决了这个问题 但我想了解为什么它们一开始就这样设计 是不是因为PDO
  • 为什么 MySQL 创建带有 _seq 后缀的表?

    我创建了一个 InnoDB 表 名为foo在 MySQL 中 一旦我对表执行插入操作 我就会看到另一个表foo seq被建造 如果我删除自动生成的表 它会在下一次插入后出现 是什么原因造成的 听起来像是正在创建一个序列 您是否有自动生成的主
  • MYSQL - 查找最近的前一天

    我可以以某种方式 不使用 PHP 找到一周中最近的前一天日期吗 Like 最近的上一个星期二的日期是哪一天 CURDATE INTERVAL WEEKDAY CURDATE wday IF WEEKDAY CURDATE gt wday 0
  • 如何在nodejs缓冲区中存储整数?

    节点jsBuffer http nodejs org docs v0 4 12 api buffers html是相当膨胀 然而 它似乎适合存储字符串 构造函数采用字符串 字节数组或要分配的字节大小 我使用的是 Node js 0 4 12
  • Nodejs 一个接一个地运行异步函数

    我是 JS nodejs 的新手 所以如果我不能提出切中要害的问题 请原谅我 所以基本上 如果我有两个异步函数 async function init async function main 如何确保在 init 完成其异步请求后调用 ma

随机推荐

  • vue3-实战-06-管理后台-品牌管理模块开发

    目录 1 品牌列表 1 1 需求图 1 2 定义接口和数据类型 1 3 请求接口和渲染数据 2 新增和修改品牌 2 1 需求原型分析 2 2 dialog开发 2 3 请求接口封装 2 4 图片上传组件开发 2 5 新增 修改品牌信息 3
  • pb中计算两个时间的分钟_利用Power BI中的两个函数,灵活计算各种占比!

    计算个体占总体的比例是一个很常见的分析方式 它很简单 就是两个数字相除 但是当需要计算的维度 总体的范围发生动态变化时 如何灵活且快速的计算出各种占比 还是需要动一点心思的 本文就通过 DAX 中的 ALL 和 ALLSELECTED 函数
  • Qt中的信号和信号槽(一)

    目录 1 信号和槽概述 信号和槽的关系 2 标准信号槽使用 标准信号 槽 示例 3 自定义信号槽使用 自定义信号 自定义槽 示例 1 信号和槽概述 信号和槽是一种事件驱动的通信机制 广泛应用于Qt框架的事件处理 GUI编程 网络通信等方面
  • pytorch计算模型参数量报错:size mismatch for module.conv1.weight: copying a param with shape torch.Size([16, 3

    错误 RuntimeError Error s in loading state dict for DataParallel size mismatch for module conv1 weight copying a param wit
  • FIO使用说明(最详细最全的参数说明)

    这个文档是对fio 2 0 9 HOWTO文档的翻译 fio的参数太多了 翻译这个文档时并没有测试每一个参数的功能和使用方法 只有少量参数做了试验 大部分的参数采用的是根据字面翻译或是个人理解的翻译 必然有些出入 先发出来 以后有使用的时候
  • 迁移学习花式Finetune方法大汇总

    如果觉得我的算法分享对你有帮助 欢迎关注我的微信公众号 圆圆的算法笔记 更多算法笔记和世间万物的学习记录 迁移学习广泛地应用于NLP CV等各种领域 通过在源域数据上学习知识 再迁移到下游其他目标任务上 提升目标任务上的效果 其中 Pret
  • JS之arguments、arguments.callee、caller介绍

    arguments 调用函数时产生的 保存实参 arguments callee 被调用时指向函数自身 caller 指向调用某函数的那个函数 下面通过一段代码说明它们的用处 function A n console log argumen
  • 线程同步之Volatile

    编译器优化 c 编译器会在不改变我们的意图的情况下做一些优化 比如 a 1 a 2 编译器编译之后 可能就只剩下第二行了 再比如 a 1 b a 编译器优化后 可能会把第二行优化成b 1 再比如 a m b n 编译器生成IL时 有可能会改
  • APP安全(一)-防二次打包(C、C++签名校验)

    前言 由于Android系统的开放性 开发出来的APP很容易被逆向 修改代码逻 加入广告 病毒等二次打包后发布 对开发者和用户造成一定的损失 因此我们的APP运行过程中需要进行签名校验 以及使用加解密算法对数据进行处理 从而保证访问服务端的
  • 开源自动化测试框架httprunner4.x的学习-2

    使用教程 接口自动化 1 如何安装 以我正在使用的v4 3 0为例 pip install httprunner 4 3 0 安装完成后检查一下 hrp v 看到如下版本信息就说明安装成功 2 创建脚手架 执行命令hrp startproj
  • windows密码获取凭证

    目录 一 Windows HASH hash windows HASH简介 二 Windows认证基础 Windows本地认证 LM HASH LM HASH简介 LM HASH生成原理 Mysql数据库密码破解 1 MYSQL数据库文件类
  • mysql程序连接驱动_Mysql驱动及其连接

    import java sql public class DB public static Connection getConn Connection conn null try Class forName com mysql jdbc D
  • 求旋转后的坐标

    坐标点target 中心点center 角度angle 旋转后坐标 function getRotatePoint targetX targetY centerX centerY angle const rotation angle Mat
  • settings.xml详解(很详细读这一篇就够了)

    目录 一 settings xml在哪里配置 有什么用 二 settings xml元素详解 2 1 LocalRepository 2 2 InteractiveMode 2 3 UsePluginRegistry 2 4 Offline
  • RT-Thread ——RTC配置

    RT Thread RTC配置 STM32F103系列芯片的RTC功能存在一些缺陷 一 显示时间戳 RTC Real Time Clock 译为实时时钟 因为它一般是集成电路 故也称为时钟芯片 它能提供精确的实时时间 可以用于产生年 月 日
  • MySQL 中视图和表的区别以及联系是什么?

    两者的区别 1 视图是已经编译好的 SQL 语句 是基于 SQL 语句的结果集的可视化的表 而表不是 2 视图没有实际的物理记录 而基本表有 3 表是内容 视图是窗口 4 表占用物理空间而视图不占用物理空间 视图只是逻辑概念的存在 表可以及
  • Codeforces Round #697 (Div. 3) C. Ball in Berland

    我的第一篇博客 XD 第一次写 小激动 一 解题思路 我一个菜鸡 看到这题 刚开始也就能想到n2算法 但肯定是过不了的 所以我又绞尽脑汁 想了一波 终于在 这题必有巧 的信念指导下 想出来了 目标是找到2个组合 让他们不冲突 那么可以显然知
  • C++学习(五十六)qt如何同时做debug和release

    CONFIG debug and release
  • Java开发 Eclipse使用技巧(转)

    1 如何设置默认的代码目录为src 默认的输出目录为bin window gt Preferences gt java gt Build Path中 右侧选择Folders就可以2 如何为快速局部变量设置getX setX属性 在代码里 g
  • node cron 动态任务调度,不同timeZone配置

    系列文章目录 前言 一 安装cron和timezone 二 创建相关db 1 定时任务开关表 2 定时任务表和运行记录表 三 相关代码实现 四 时区数据下载 五 time cron 前言 使用cron 插件实现动态任务调度 配置不同时区的定