nodejs定时任务

项目需求:

  1. 每5秒执行一次,多个定时任务错开,即cron表达式中斜杆前带数字,例如 ‘1/5 * * * * *’
  2. 定时任务准时,延误低

搜索了nodejs的定时任务,其实不多,找到了以下三个常用的:

  • node-cron
  • node-schedule
  • cron

1 node-cron

示例代码

const nodeCron = require('node-cron');
// 每5秒执行一次
const cron = '*/5 * * * * *';
// 自带验证cron的有效性
const valid = nodeCron.validate(cron)
if(!valid) {console.log(cron,' ===> Cron 无效');return;
}
nodeCron.schedule(cron, () => {console.log(dayjs().format('HH:mm:ss'))// todo: do task
});

优点:运行稳定,自带校验方法 validate
缺点:cron表达式不支持斜杆前面带数字,例如从第2秒开始每5秒执行一次,即 ‘2/5 * * * * *’

2 node-schedule

最早用了 node-schedule
每天定时截图然后自动发送邮件,以达到自动巡检的目的,每天一次,已经运行2年了,没什么问题。

示例代码:

const nodeSchedule= require('node-schedule')
// 工作日的8:55:00
const rule = {hour:8, minute:55, second:0, dayOfWeek:[1,2,3,4,5]};
nodeSchedule.scheduleJob(rule, async () => {const res = await doScreenshot();})// 截图任务
const doScreenshot = ()=>{// todo: return new Promise...
}// 当进程退出时优雅结束任务
process.on('SIGINT', function () {console.log('========= SIGINT')nodeSchedule.gracefulShutdown().then(() => process.exit(0))
})

然而,在另外一个项目里面使用了cron表达式,在执行较为复杂的任务时,发现偶发在某个整点里面触发2次

// 每5秒执行一次
const cron = '*/5 * * * * *';
nodeSchedule.scheduleJob(cron,()=>{console.log(dayjs().format('HH:mm:ss'))// todo: do task
})

优点:支持cron表达式斜杆前面带数字,弥补了 node-cron 缺点,自带优雅结束所有任务方法,rule规则还支持对象文本语法
缺点:当使用cron表达式,频繁执行复杂任务时,任务时间会出现错乱,整点还会偶发触发2次,比较适合时间间隔比较大的而无阻塞的任务

3 cron

最后选择这个,刚好满足项目需求。

示例代码

const CronJob = require('cron').CronJob;
const validator = require('cron-validator')const createCronJob = (cron) => {const isValid = validator.isValidCron(cron, { seconds: true, allowBlankDay: true, alias: true, allowSevenAsSunday: true })if (!isValid) {console.log(cron, ' ===> Cron 无效');return;}const job = new CronJob(cron.replace('?', '*'),  // 不支持问号,则将cron的问号转成*function () {console.log(dayjs().format('HH:mm:ss'))// todo: do task},(e) => { console.log('complete ', e) },true,'Asia/Shanghai');console.log('job cron: ',job.cronTime.source)return job;
}createCronJob('*/5 * * * * *')

示例代码里面增加了一个’cron-validator’ 用来做cron校验。

优点:支持cron表达式斜杆前面带数字,弥补了 node-cron 缺点
缺点:不支持最后一位的问号,不过可以将问号替换为星号

最后选择了cron,目前运行稳定

最后附上通配符解释
在这里插入图片描述

如果只有5位,则是省略了秒,即第一位表示分钟
如果有6位,则第一位表示秒
也有7位的,最后一位表示年

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

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

相关文章

OpenCV中的HoughLines函数和HoughLinesP函数到底有什么区别?

一、简述 基于OpenCV进行直线检测可以使用HoughLines和HoughLinesP函数完成的。这两个函数之间的唯一区别在于,第一个函数使用标准霍夫变换,第二个函数使用概率霍夫变换(因此名称为 P)。概率版本之所以如此,是因为它仅分析点的子集并估计这些点都属于同一条线的概率。此实…

2D游戏开发和3D游戏开发有什么不同?

2D游戏开发和3D游戏开发是两种不同类型的游戏制作方法,它们之间有一些显著的区别: 1. 图形和视觉效果: 2D游戏开发: 2D游戏通常使用二维图形,游戏世界和角色通常在一个平面上显示。这种类型的游戏具有平面的外观&…

数据仓库模型设计V2.0

一、数仓建模的意义 数据模型就是数据组织和存储方法,它强调从业务、数据存取和使用角度合理存储数据。只有将数据有序的组织和存储起来之后,数据才能得到高性能、低成本、高效率、高质量的使用。 高性能:良好的数据模型能够帮助我们快速查询…

shell脚本命令

Shell命令是在类Unix操作系统中使用的命令行解释器(shell)中执行的命令。Shell命令可以用于执行系统命令、操作文件、进行文本处理、管理进程等。以下是一些常见的Shell命令: 1. ls:列出当前目录下的文件和文件夹。 2. cd&#x…

界面组件DevExpress WinForms v23.1亮点 - 全新升级HTML CSS模板

DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…

2020-2023中国高等级自动驾驶产业发展趋势研究-概念界定

1.1 概念界定 自动驾驶发展过程中,中国出现了诸多专注于研发L3级以上自动驾驶的公司,其在业界地位也越来越重要。本报告围绕“高等级自动驾驶” 展开,并聚焦于该技术2020-2023年在中国市场的变化趋势进行研究。 1.1.1 什么是自动驾驶 自动驾驶…

C#中的方法

引言 在C#编程语言中,方法是一种封装了一系列可执行代码的重要构建块。通过方法,我们可以将代码逻辑进行模块化和复用,提高代码的可读性和可维护性。本文将深入探讨C#中的方法的定义、参数传递、返回值、重载、递归等方面的知识,…

小型水库雨水情测报和大坝安全监测解决方案

一、建设背景 我国小型水库数量众多,大多由农村集体经济组织管理,灌溉、供水、防洪、生 态效益突出,是农业生产、农民生活、农村发展和区域防洪的重要基础设施,实施乡 村振兴战略和生态文明建设的重要支撑保障。由于小型水库工程存…

zabbix自定义监控内容案例

一、自定义监控内容 案列:自定义监控客户端服务器登录的人数需求:限制登录人数不超过 3 个,超过 3 个就发出报警信息 1、在客户端创建自定义key 明确需要执行的linux命令 创建zabbix监控项配置文件,用于自定义Key #在zabbix的…

小谈设计模式(3)—策略模式

小谈设计模式(3)—策略模式 专栏介绍专栏地址专栏介绍 策略模式主要角色环境(Context)抽象策略(Strategy)具体策略(Concrete Strategy)角色总结 核心思想封装算法定义抽象策略使用环…

Selenium Grid 的搭建方法

传统 Selenium Grid 的搭建方法 搭建一个具有 1 个 Node 的 Selenium Grid。那么通常来讲我们需要 2 台机器,其中一台作为 Hub,另外一台作为 Node,并要求这两台机器已经具备了 Java 执行环境。 1.通过官网下载 selenium-server-standalone-…

SpringMVC之JSON数据返回异常处理机制

目录 前言 一、JSON数据返回 1.导入依赖 2.配置spring-mvc.xml 3.使用ResponseBody注解 4.Jackson 4.1.介绍 4.2.常用注解 二、异常处理机制 1.为什么要全局异常处理 2.异常处理思路 3.SpringMVC异常分类 4.综合案例 4.1.异常处理方式一 4.2.异常处理方式二 4.3…

git提示:remote origin already exists

目录 问题场景 问题原因 问题解决 问题场景 在GitLab中新建仓库后,然后将本地项目提交提示:remote origin already exists. 问题原因 error: remote origin already exists. 错误:远程源点已存在(翻译) 出现该错误的…

AI AIgents时代-(四.)应用上手

HuggingGPT & MetaGPT . 🟢 HuggingGPT HuggingGPT是一个多模型调用的 Agent 框架,利用 ChatGPT 作为任务规划器,根据每个模型的描述来选择 HuggingFace 平台上可用的模型,最后根据模型的执行结果生成总结性的响应。 这个项…

软件测试 —— 答疑篇

什么是软件测试: 软件测试是不是就是找 bug ? 软件测试就是证明软件不存在错误的过程 软件测试就是为了证明程序能够正确运行 刚新买来一部手机,我们要干什么? 一场考试 , 做完一遍题目之后 , 进行一遍检查 , 就是在 "…

【LeetCode热题100】--560.和为K的子数组

560.和为K的子数组 示例2的结果: 输入:nums [1,2,3] ,k3的时候 连续子数组有[1,2],[3],一共有2个 利用枚举法: 枚举[0,…i]里所有的下标j来判断是否符合条件 class Solution {public int subarraySum(int[] nums, int k) {i…

不得不爱的AI艺术写真头像二维码生成小程序开发

最近什么最火?AI最火! AI里什么最火?艺术写真生成和二维码美化最火。 一款小程序集合了高还原度的AI写真艺术照和二维码美化,你们说香还是不香? 并且加入了输入心愿就能生成独一无二的个性头像功能,直接…

uniapp 轮播列表左右滑动,滑动到中间放大

html <!-- 轮播 --><view class"heade"><swiper class"swiper" display-multiple-items3 circulartrue previous-margin1rpxnext-margin1rpx current0 change"swiperChange" ><block v-for"(item,index) in list"…

【面试经典150 | 数组】删除有序数组中的重复项 II

文章目录 写在前面Tag题目解读题目来源解题思路方法一&#xff1a;原地操作 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等…

淘宝拍立淘插件转链和商业化图片生成接口介绍,图片搜索商品接口,按图搜索接口,图片识别商品接口介绍

淘宝拍立淘是淘宝网推出的一种搜索方式&#xff0c;通过拍立淘&#xff0c;用户可以输入文字描述或上传图片来搜索商品。拍立淘通过与淘宝网进行数据接入和授权&#xff0c;使用淘宝提供的API获取商品信息和操作权限&#xff0c;拍立淘使用图像识别技术&#xff0c;通过深度学习…