nodeJS中定时任务cron的使用

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值