cron模块可以帮助我们在node中定时执行任务。如果定时需求是简单的setInterval()与setTimeout()计时器所无法满足的比较复杂的定时规则,可以使用cron来配置。
安装cron模块
npm install cron
代码中启动一个任务
var cronJob = require("cron").CronJob;
//每秒执行一次
new cronJob('* * * * * *', function () {
//需要定时执行的任务代码写在这里
}, null, true,'Asia/Chongqing');
//true代表直接启动
//'Asia/Chongqing' 时区的填写,如果要国内的时区将 America/Los_Angeles 改为 Asia/Chongqing
不立即执行任务,人工启动,人工停止
var jobid = new cronJob('* 26 10,18 * * *', function () {
//your job code here
}, null, false, 'Asia/Chongqing');
jobid.start();
jobid.stop();
设置时区
cronJob中的时间适合时区有关的,所以需要配合正确的时区,关于时间可以参考这篇文章:
http://blog.csdn.net/newborn2012/article/details/17753635
动态设置时间
var jobid = new cronJob('* * * * * *', function () {
//your job code here
}, null, false, 'Asia/Chongqing');
var second = "12";
var minute = "0";
var hour = "8-19";
var interval = "3";
var time = require("cron").time(second + ' ' + minute + ' ' + hour+ '/' + interval + ' * * *', 'Asia/Chongqing');
jobid.stop();
jobid.setTime(time);
jobid.start();
这里粘出我自己封装的方法,需求:1.可以启动多个定时任务,2.我可以指定停止某一个任务,3.在项目启动时可以获取所有的定时任务并启动
var cronJob = require("cron").CronJob;
var UUID = require('node-uuid')
import {sqlQuery} from "../model/sql" //自己封装的sql查询
export default class CronExpression{
public cronExpressObj = {
cron:"",
cronContent:"",
}
constructor(){
}
// 启动任务
taskStart(obj1){
//把cron表达式里面的?转化为*
obj1.cron = obj1.cron.replace(/\?/ig,"*")
this.cronExpressObj = {
cron:obj1.cron,
cronContent:obj1.cronContent,
}
return new cronJob(obj1.cron, async function () {
//这里面列举几个cron表达式的拼接
// var arrObj = [{cron:"* * * * * ?",cronContent:"每秒钟执行一次"},
// {cron:"*/30 * * * * ?",cronContent:"每隔30秒执行一次"},
// {cron:"0 0/3 * * * ?",cronContent:"每隔3分钟执行一次"},
// {cron:"0 49 15,16 * * ?",cronContent:"每天15:49,16:49执行一次"},
// {cron:"0 03 16 * * 0,1,2,3,4,5,6",cronContent:"每周一,周二,周三,周四,周五,周六,周日的16:03执行一次"},
// {cron:"0 15 17 * 5,6,7,8,10 *",cronContent:"每月5号6号7号8号10号的17:15执行一次"}]
console.log('定时任务',obj1.cron,'++',new Date().toLocaleString())
//这里可以写方法 传一个方法的参数过来
//your job code here
}, null, false, 'Asia/Chongqing'); //时区的填写,如果要国内的时区将 America/Los_Angeles 改为 Asia/Chongqing
}
//生成定时任务实例并且放到本地数组里面 并启动
timingTaskAdd(obj){
/**
* {
cron:"* * * * * *",cronContent:"每秒钟执行一次",timing_task_id:""}
*/
let taskStart1 = this.taskStart(obj)
global.cronExpressionArr[obj.timing_task_id] = taskStart1 // 把定时任务保存到本地变量里面用于停止方法
taskStart1.start() // 启动定时任务
}
//停止定时任务及从本地数组删除
timingTaskDel(id){
if(global.cronExpressionArr[id]){
global.cronExpressionArr[id].stop()
delete global.cronExpressionArr[id]
}else{
return 'error'
}
}
//开启所有的任务
async startAllTask(){
let sqlData:any = await sqlQuery(``) //sql查询出所有有效的任务列表
if(sqlData.results && sqlData.results.length > 0){
let allTaxk = sqlData.results
for(var i = 0; i <allTaxk.length;i++){
//获取定时任务实例
this.timingTaskAdd({
cron:allTaxk[i].cron_expression,
cronContent:allTaxk[i].content,
timing_task_id:allTaxk[i].id
})
}
}
}
}
global.cronExpressionArr这个参数为node的全局参数,详情请参考另一篇https://blog.csdn.net/pnjtvxcp/article/details/107862057