nodejs定时任务

news2024/11/29 12:46:25

项目需求:

  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.coloradmin.cn/o/1028131.html

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

相关文章

无涯教程-JavaScript - BETA.INV函数

描述 BETA.INV函数返回beta累积概率密度函数(BETA.DIST)的反函数。如果概率 BETA.DIST(x ... TRUE),则BETA.INV(概率...) x。 在预期的完成时间和可变性的情况下,可以在项目计划中使用beta分布来建模可能的完成时间。 语法 BETA.INV (probability,alpha,beta,[A],[B])争论 …

Linux中使用selenium截图的文字变为方框的解决方案

一、前言 最近在Linux中使用selenium截图时,发现文字都变为了方框: 虽然不影响selenium的使用,但有点影响调试,也不好看,后面发现是因为Linux缺少中文字体的缘故,需要安装中文字体就能解决。 二、安装中文…

安卓Android_手机安装burp的https_CA证书

安卓Android_手机安装burp的https_CA证书 文章目录 安卓Android_手机安装burp的https_CA证书1 打卡电脑wif热点,手机连上电脑的热点2 burp点击 --》 Proxy settings3 点击add ---》新增代理地址和端口4 设置好-展示5 手机连上电脑的wifi热点6 点击查看ip地址与burp …

这些英国学校接受ChatGPT帮助写作

自从ChatGPT展现了其高超的AI技术,全球年轻人纷纷对其表示喜爱,尤其是学生们,将其视为一个优化版的网络搜索引擎,可以用来提高学习效率。 ChatGPT具有多样化的功能,可以节省研究复杂文献的时间,编写简单的…

stm32学习-芯片系列/选型

【03】STM32HAL库开发-初识STM32 | STM概念、芯片分类、命名规则、选型 | STM32原理图设计、看数据手册、最小系统的组成 、STM32IO分配_小浪宝宝的博客-CSDN博客  STM32:ST是意法半导体,M是MCU/MPU,32是32位。  ST累计推出了&#xff1a…

AIGC生成式代码——Code Llama 简介、部署、测试、应用、本地化

导读: 本文介绍了CodeLlama的简介、本地化部署、测试和应用实战方案,帮助学习大语言模型的同学们更好地应用CodeLlama。我们详细讲解了如何将CodeLlama部署到实际应用场景中,并通过实例演示了如何使用CodeLlama进行代码生成和优化。最后,总结了CodeLlama的应用实战经验和注…

9.4.2servlet基础2

一.SmartTomcat 1.第一次使用需要进行配置. 二.异常处理 1.404:浏览器访问的资源,在服务器上不存在. a.检查请求的路径和服务器配置的是否一致(大小写,空格,标点符号). b. 确认webapp是否被正确加载(检查web.xml没有/目录错误/内容错误/名字拼写错误)(多多关注日志信息). 2…

typeof的作用

typeof 是 JavaScript 中的一种运算符,用于获取给定值的数据类型。 它的作用是返回一个字符串,表示目标值的数据类型。通过使用 typeof 运算符,我们可以在运行时确定一个值的类型,从而进行相应的处理或逻辑判断。 常见的数据类型…

slam 点云退化

Lidar Slam退化问题分析报告 摘要:激光雷达在空旷区域存在点云采集数据较少,特征无法对机器人的位置起到约束的作用,考虑LIW融合对最终定位的影响。当错误的LIW即发生退化,位姿输出不准存在较大误差,如果未检测到退化…

MyBatis 插件机制

文章目录 前言自定义插件创建拦截器配置拦截器效果验证 插件实现原理初始化操作如何创建代理对象ExecutorStatementHandlerParameterHandlerResultSetHandler 执行流程 前言 插件是一种常见的扩展方式,大多数开源框架也都支持用户通过添加自定义插件的方式来扩展或…

Element树形控件使用过程中遇到的问题及解决方法

1.需求1点击编辑按钮&#xff0c;出现修改组织弹窗&#xff0c;且将点击时的组织名称返现在输入框中。 思路是点击编辑按钮&#xff0c;取到节点点击时返回的data信息中的label进行赋值即可。 <el-treestyle"margin-top: 20px":data"organizationTreeData…

vuex的state,getters,mutations,actions,modules

目录 Vuex核心概念&#xff1a;1、State1&#xff09;全局state2&#xff09;使用modules中的state 2、Getters1&#xff09;全局Getters2&#xff09;使用modules中的getters 3、Mutations1&#xff09;全局Mutations2&#xff09;使用modules中的mutations&#xff08;namesp…

自由职业者的福音来啦!人工智能带你智能规划,做你所擅长的事情

原创 | 文 BFT机器人 大多数人选择自由职业者是因为他们追求自由。你想一想&#xff0c;自雇或“为自己工作”伴随着选择客户和管理日程安排的诱惑。所以&#xff0c;自由职业者的数量正在增长也就不足为奇了。 这是经济与政策研究中心报告的&#xff0c;该中心在一项研究中发…

DT卡通学习二

相交线查找 轮廊线 和笔刷结合使用 材质

springboot实现监听

1、新建ApplicationEvent 在Spring Boot中实现监听器&#xff08;Listener&#xff09;的一种常见方式是使用Spring Boot的事件监听机制。 下面是一个简单的步骤说明&#xff0c;帮助你实现一个自定义的监听器&#xff1a; 创建事件&#xff1a;首先&#xff0c;你需要创建一…

CMake:测试的其他补充(重要)

CMake:测试的其他补充&#xff08;重要&#xff09; 导言预期测试失败项目结构CMakeLists.txt相关源码输出结果 使用超时测试运行时间过长的测试项目结构CMakeLists.txt相关源码输出结果 并行测试项目结构CMakeLists.txt相关源码输出结果 运行测试子集项目结构CMakeLists.txt相…

jeesite自定义按钮,批量添加子表数据的二种方式

文章目录 前言一、使用框架自带方法1.设置弹窗表格多选2.修改按钮样式3.回调业务逻辑二、使用自定义弹窗1.添加按钮2.自定义弹窗3. 修改弹窗表格多选三、打开弹窗自定义弹窗中表格参数1.弹窗代码中可自定义参数2.自定义弹窗传参四、提交表单1. 提交子表表单字段不匹配总结前言 …

【新版】系统架构设计师 - 案例分析 - 软件工程

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 结构化分析SA数据流图DFD数据流图平衡原则答题技巧例题1例题2 面向对象的分析OOA用例图用例模型细化用例描述用例关系【包含、扩展、泛化】分析模型定义概念类确定类之间的关系类图与对象图实体类 - 存储…

Autosar模块介绍:内存模块简介

上一篇 | 返回主目录 | 下一篇 Autosar模块介绍&#xff1a;内存模块简介 1 内存基本概念及分类1.1 内存基本分类及基本作用1.2 TC397芯片内存说明&#xff08;示例&#xff09; 2 内存管理基本概念2.1 代码运行基本逻辑2.2 代码及数据管理2.3 非易失性数据管理2.3.1 EEPROM2.…

中手游上半年扭亏为盈,仙剑IP魅力不减?

你也曾有过江湖梦吗&#xff1f;你也曾因“为国为民、为友为邻”的侠者心无处可安而苦恼吗&#xff1f;那么&#xff0c;“仙剑”系列游戏或许可以成为你的灵魂寄托之所。而能让侠者的江湖梦具象化的幕后厂商&#xff0c;便是中手游。 两年前&#xff0c;中手游斥巨资买下了仙…