Node.js中基于node-schedule实现定时任务之详解

文章目录

      • 一、定时任务
      • 二、node-schedule、
        • 1、安装
        • 2、引入
        • 3、基于Cron表达式的规则
        • 4、基于Date的规则
        • 5、基于RecurrenceRule的规则
        • 6、API
        • 7、状态监听

一、定时任务

实际工作中,可能会遇到定时清除某个文件夹内容,定时发送消息或发送邮件给指定用户,定时导出某些数据等。借助setTimeout和setInterval来实现的化太过麻烦,node-schedule是一个非常不错的npm包,可以帮助我们快速的创建和管理定时任务。

定时任务是指在预定的时间点或时间间隔内执行的任务或操作。它们是自动化执行特定逻辑的一种方式,可用于执行重复性的、周期性的或计划性的任务。

定时任务通常用于以下情况:

  • 数据管理与备份:定时任务可以用于定期备份数据库中的数据,确保数据的安全性和可靠性。此外,还可以用于多个数据源之间的数据同步,保证数据的一致性。

  • 系统监控与维护:定时任务可以用于监控系统中的各种指标和状态,如服务器负载、数据库连接池的使用情况等,及时发现并解决潜在的问题。同时,也可以用于定期刷新缓存,保证缓存数据的及时性和准确性。

  • 执行定时任务:定时器可以用于在预定的时间间隔内执行特定的任务或代码块,例如数据备份、日志清理、缓存刷新等操作。

  • 定时提醒和通知:定时器可以用于实现定时提醒和通知功能,如闹钟、定时器应用等,通过设置定时器,在指定的时间点触发提醒或通知,帮助用户记住重要事件或完成特定任务。

  • 自动保存和自动提交:定时器可以用于自动保存或自动提交表单数据,通过设置定时器,在一定的时间间隔内自动将用户输入的数据保存到服务器或数据库,避免数据丢失或用户忘记保存的情况。

  • 定时刷新页面内容:定时器可以用于定时刷新页面的特定部分或整个页面,通过设置定时器,在一定的时间间隔内更新页面内容,如实时展示新闻、股票行情等。

  • 会话管理与心跳检测:在Web应用中,定时器可以用来检查并清理长时间未活动的用户会话,以及客户端和服务端之间利用定时器发送心跳包来维持长连接,及时发现连接异常。

  • 延迟执行与调度任务:定时器可以用于延迟发送消息或在非高峰时段执行批处理作业,减轻服务器负载。

二、node-schedule、

1、安装
npm install node-schedule
2、引入

CommonJS:

const schedule = require('node-schedule');

ES模块

import schedule from 'node-schedule'
3、基于Cron表达式的规则

Cron表达式是一种用于指定定时任务执行时间的字符串表示形式。它由6个字段组成,每个字段表示任务执行的时间单位和范围。

*    *    *    *    *    *
┬    ┬    ┬    ┬    ┬    ┬
│    │    │    │    │    │
│    │    │    │    │    └ 星期几(0 - 7) (0相对于周日) 
│    │    │    │    └───── 月 (1 - 12)
│    │    │    └────────── 日 (1 - 31)
│    │    └─────────────── 时 (0 - 23)
│    └──────────────────── 分 (0 - 59)
└───────────────────────── 秒 (0 - 59)

每个字段可以接受特定的数值、范围、通配符和特殊字符来指定任务的执行时间:

  • 数值:表示具体的时间单位,如1、2、10等。
  • 范围:使用-连接起始和结束的数值,表示一个范围内的所有值,如1-5表示1到5的所有数值。
  • 通配符:使用表示匹配该字段的所有可能值,如表示每分钟、每小时、每天等。
  • 逗号分隔:使用逗号分隔多个数值或范围,表示匹配其中任意一个值,如1,3表示1或3。
  • 步长:使用/表示步长,用于指定间隔的数值,如*/5表示每隔5个单位执行一次。
  • 特殊字符:Cron表达式还支持一些特殊字符来表示特定的含义,如?用于替代日和星期字段中的任意值,L表示最后一天,W表示最近的工作日等。

使用cron字符串作为rule时,建议写完整,可读性比较好。

以下是一些常见的Cron表达式示例:

* * * * * *     :每秒执行*/5 * * * * *   :每5秒执行* 30 * * * *    :每30分钟执行*/10 30 * * * * :每30分钟的10秒执行2,4,6 * * * * * :每个2秒,4秒和6秒执行0 0 0 ? * 1     :每周一早上的零点执行* * * 20 * ?    :每月的20日触发
4、基于Date的规则

当你需要在具体的时间执行一次,可以使用new Date来定义一个时间。

假设您非常希望在一个精确到某一个时间点上的秒数的仅触发一次的计划。

const schedule = require('node-schedule');
//2024年,6月,1日,6时,1分,0秒
//month 范围是 0~11 而非1~12
const date = new Date(2024, 5, 1, 6, 1, 0);
const job = schedule.scheduleJob(date, ()=>{console.log('Happy Children’s Day !');
});
5、基于RecurrenceRule的规则

如果你的任务是定时重复执行的,并且你希望有比cron更高的可读性,你可以尝试使用RecurrenceRule对象作为rule。

function Recurrence(year, month, date, dayOfWeek, hour, minute, second, tz)

dayOfWeek 范围是 0~6
month 范围是 0~11 而非1~12
如果是连续的值,node-schedule提供了一个Range函数用于创建连续的元素

  • 每分钟的15、30、45秒执行
const rule = new schedule.RecurrenceRule();
//每个15、30、45秒执行
rule.second = [15, 30, 45];
const job = schedule.scheduleJob(rule, () => {console.log(`每次计划执行的时间:${new Date().toLocaleString()}`);
});

在这里插入图片描述

  • 每分钟的第10秒
rule.second = 10;

在这里插入图片描述

  • 每小时的第10分钟
rule.minute = 10;
  • 每周四,周五,周六,周天的17点
rule.dayOfWeek = [0, new schedule.Range(4, 6)];
rule.hour = 17;
rule.minute = 0;
6、API
  • 开启定时任务

需要用到scheduleJob函数,会返回一个Job实例对象:

function scheduleJob(name: string, rule: ..., callback: function): schedule.Job

参数

参数名参数类型参数描述
name任务名,当你没有指定时,它将以时间戳作为名字。
rule任务调度的规则,支持多种形式的rule:
string - Cron表达式
number
schedule.RecurrenceRule
Date
callback创建任务时的回调函数

可以通过scheduleJob(name, rule, callback)或者scheduleJob(rule, callback)创建计划。

const rule = '* * * * * *';
const job = schedule.scheduleJob(rule,()=>{});
  • 取消定时任务
schedule.cancelJob(id)
7、状态监听
import schedule from 'node-schedule';//设置规则
const rule = "*/10 * * * * *"//设置任务
const job = schedule.scheduleJob(rule, () => {console.log('2、每次计划执行中的事件。');
});job.on("scheduled", () => {console.log("1、每次计划执行前的事件。");
});job.on("run", () => {console.log("3、每次计划执行后的事件。");
});job.on("success", () => {console.log(`4、每次计划执行成功事件。`);
});job.on("error", (err) => {console.log(`[error][${new Date().toLocaleString()}]${err.message}`);
});job.on("canceled", () => {console.log("计划取消!");
})

在这里插入图片描述

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

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

相关文章

Django集成OpenAI

Django集成OpenAI 通过前面 django 框架的基本开发知识,我们现在可以开始在 django 上做稍微深一点当然应用开发了。 这一章开始编写怎么集成调用 openai ,设置环境以及 openai 的基础知识。 大家都知道 ai 的多模态逐渐扩大,各种应用层出…

怎么采集阿里巴巴1688的商品或商家数据?

怎么使用简数采集器批量采集阿里巴巴1688的商品或商家相关信息呢? 简数采集器暂时不支持采集阿里巴巴1688的相关数据,谢谢。 简数采集器采集网络网页数据非常简单高效:输入要采集的网址,简数智能算法会自动提取出网页上的关键信…

探索数据结构:集合、线性结构、树状结构和图形结构

在计算机科学中,数据结构是用于组织和存储数据的基础。不同的数据结构有不同的特点和适用场景。今天,我们将深入探讨四种主要的数据结构:集合、线性结构、树状结构和图形结构。通过对它们的理解,您可以更好地选择和应用这些结构来…

IOS Swift 从入门到精通:算术运算,运算符重载,符合赋值运算,比较运算,条件,结合条件,三元运算,Swift语句,范围运算

目录 算术运算符 运算符重载 复合赋值运算符 比较运算符 条件 结合条件 三元运算符 Switch 语句 范围运算符 总结 算术运算符 现在您已经了解了 Swift 中的所有基本类型,我们可以开始使用运算符将它们组合在一起。运算符是那些像和 这样的小数学符号-&…

外贸找客户软件

外贸找客户软件在帮助外贸企业或个人寻找潜在客户、提高销售效率方面起着重要作用。以下是一些常用的外贸找客户软件,它们各有特点和优势,可以根据具体需求选择使用。 阿里巴巴国际版: 阿里巴巴国际版App为外贸人提供了一个巨大的B2B平台&am…

qt 开发对信号槽进行二次封装,实现信号槽管理接口。

最近做的一个项目,由于工程需要模块之间能够互相通信,但又不想模块之间耦合度太高 使用信号槽的话,需要两个类的对象或者指针在其中一个类都要体现,这样达不到效果, 想要一个管理类对这些互相通信的类之间进行管理,只需要在各自的类注册发送者和接收者即可,双方通过一…

Charles抓取安卓应用https包演示

一、准备软件 夜神安卓模拟器 (yeshen.com) Charles (charlesproxy.com) 二、配置抓包 2.1 Charles安装PC根证书 记住这里的ip端口 三、安卓模拟器配置 3.1 配置安卓客户端网络代理 填写上文的ip端口,保存 3.2 安装根证书 3.2.1 导出根证书 linux主机执行 op…

推荐4款实用工具,非常好用,建议收藏

PDFREAL PDFReal 是一个功能强大的在线PDF编辑工具,提供多种实用的PDF处理功能。用户可以在一个网站上完成包括PDF合并、PDF拆分、PDF压缩、PDF保护、PDF解锁等多种操作。此外,PDFReal 还支持将文本转换为PDF、将图片转换为PDF、添加水印、提取页面内容等…

基于Django、Bootstrap的电影推荐系统,算法基于用户的协同过滤算法,有爬虫有可视化后台

背景 基于Django和Bootstrap的电影推荐系统结合了用户协同过滤算法,通过爬虫技术获取电影数据,并在可视化后台展示推荐结果。该系统旨在提供个性化的电影推荐服务,帮助用户发现符合其喜好的电影。 用户协同过滤算法是一种常用的推荐算法&am…

qt开发-09_分裂器

QSplitter 是 Qt 框架中的一个非常实用的控件,用于创建可调整大小的窗格。它允许用户通过拖动子窗口间的边界(也称为分割条)来动态调整子窗口的尺寸。这在开发需要多个视图同时显示,且用户需要根据需要调整每个视图大小的应用程序…

【408考点之数据结构】表达式求值和括号匹配

表达式求值和括号匹配 表达式求值 表达式求值是计算机科学中的一个基本问题,涉及将数学表达式转换为计算机可以理解和处理的形式。通常,我们使用栈来辅助求值过程,特别是在处理中缀表达式转后缀表达式和后缀表达式求值时。 中缀表达式转后…

机器学习python实践——由特征选择引发的关于卡方检验的一些个人思考

最近在用python进行机器学习实践,在做到特征选择这一部分时,对于SelectPercentile和SelectKBest方法有些不理解,所以去了查看了帮助文档,但是在帮助文档的例子中出现了"chi2",没接触过,看过去就更…

基于SpringBoot+Vue在线考试报名系统设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,…

【APP移动端性能测试】第四节.APP移动端常见的性能测试点(下)

文章目录 前言五、流量性能测试 5.1 流量基本情况说明 5.2 流量的测试步骤 5.3 流量的优化方法六、电量性能测试 6.1 电量基本情况说明 6.2 电量的测试步骤 6.2 电量的结果分析七、APP启动测试 7.1 APP启动的两种方式 7.2 APP启动的测…

简单了解JDBC相关操作

JDBC 1、概念 JDBC就是使用java语言操作关系型数据库的一套API,全称java数据库连接。 2、具体步骤 创建工程,导入驱动jar包注册驱动获取连接定义SQL语句获取执行SQL语句的对象执行SQL处理返回结果释放资源 Testpublic void jdbcTest() throws Class…

Python中列表的常用操作

列表的基本使用 arr []# append arr.append(1) print(arr)arr.append("a") print(arr)列表的增删改查 arr []arr.append(1) arr.append(2) arr.append(3)print(arr)# pop arr.pop() print(arr)# update arr[0] 333 print(arr)# get print(arr[0])列表的复制 ar…

Qt Quick介绍

一.Qt Quick介绍 Qt Quick 是 QML 类型和功能的标准库,包括视觉类型、交互式类型、动画、模型和视图、粒子效果和着色效果 Qt Quick 使用 QML 作为声明语言,来设计以用户界面为中心的应用程序 QML 包含大量使用手机移动设备的功能模块,比如基…

python-邮票组合问题

[题目描述] 某人有四张3分的邮票和三张5分的邮票,用这些邮票中的一张或若干张可以得到多少种不同的邮资?输入格式: 此题无输入。输出格式: 输出可以得到不同邮资的数量。 样例输入 无样例输出 19数据范围: 对于100%的…

使用invokeMethod异步执行QT函数操作

在QT窗口初始化加载的时候如果执行比较耗时的操作,很容易阻塞主界面的显示,导致用户体验差。这时候一般我们可以通过定时器延时加载对应的操作。其实使用QMetaObject::invokeMethod方法也可以实现异步加载,操作更简单效果更好。两种方式如下: //异步执行loadData函数 //Qt:…

【抽代复习笔记】21-群(十五):循环群引理及定义

例4:证明,如果σ(i1 i2 … ik)是Sn中的一个k-循环,而r∈Sn,则rσr^(-1)也是一个k-循环,且rσr^(-1)(r(i1),r(i2),…,r(ik))。 证:①设σ(i1 i2 … ik)(i1 ik)(i1 ik-1)…(i1 i2), 则rσr^(-1)…