zoukankan      html  css  js  c++  java
  • node定时任务——node-schedule模块使用说明

    在实际开发项目中,会遇到很多定时任务的工作。比如:定时导出某些数据、定时发送消息或邮件给用户、定时备份什么类型的文件等等。

    一般可以写个定时器,来完成相应的需求,在node.js中自已实现也非常容易,接下来要介绍的是node-schedule来完成定时任务。

    下面就用示例来说明一下node-schedule的用法。

    安装:

    npm install node-schedule

    Cron风格定时器

    var schedule = require('node-schedule');
    
    function scheduleCronstyle(){
        schedule.scheduleJob('30 * * * * *', function(){
            console.log('scheduleCronstyle:' + new Date());
        }); 
    }
    
    scheduleCronstyle();

    schedule.scheduleJob的回调函数中写入要执行的任务代码,一个定时器就完成了!

    Cron参数说明

    *    *    *    *    *    *
    ┬    ┬    ┬    ┬    ┬    ┬
    │    │    │    │    │    |
    │    │    │    │    │    └ day of week (0 - 7) (0 or 7 is Sun)
    │    │    │    │    └───── month (1 - 12)
    │    │    │    └────────── day of month (1 - 31)
    │    │    └─────────────── hour (0 - 23)
    │    └──────────────────── minute (0 - 59)
    └───────────────────────── second (0 - 59, OPTIONAL)

    6个占位符从左到右分别代表:秒、分、时、日、月/年、周几。

    '*'表示通配符,匹配任意,当秒是'*'时,表示任意秒数都触发,其它类推。

    下面可以看看以下传入参数分别代表的意思:

    • 每分钟的第30秒触发: '30 * * * * *'
    • 每小时的1分30秒触发 :'30 1 * * * *'
    • 每天的凌晨1点1分30秒触发 :'30 1 1 * * *'
    • 每月的1日1点1分30秒触发 :'30 1 1 1 * *'
    • 2016年的1月1日1点1分30秒触发 :'30 1 1 1 2016 *'
    • 每周1的1点1分30秒触发 :'30 1 1 * * 1'

    这样很容易根据自已的需求用简短的代码去实现。

    注意:六个值之间使用空格分隔;如某个位置上有多个值可以使用逗号(m,n)分隔;如某个位置值是一个区间可以使用中划线(m-n);如某个位置的时间含有间隔执行可以使用斜线(*/n);如只有五位则默认秒为0,
    第一位从分钟开始计算。 '0 17 * * 1-5':表示每周一至周五下午五点整执行一次; '*/5 12,18,21 * * 0,6':表示周六周日的12时、18时和21时,每个小时内每隔5分钟执行一次;

    对象规则定时器

    为了更加方便,还支持直接使用对象作为规则:

    var j = schedule.scheduleJob({hour: 14, minute: 30, dayOfWeek: 0}, function(){
      console.log('Time for tea!');
    });

    设置开始时间和结束时间

    let startTime = new Date(Date.now() + 5000);
    let endTime = new Date(startTime.getTime() + 5000);
    var j = schedule.scheduleJob({ start: startTime, end: endTime, rule: '*/1 * * * * *' }, function(){
      console.log('Time for tea!');
    });

    上面代码中,任务将在5秒后开始,10秒后结束,期间每秒都将执行。

    Date对象规则定时器

    使用指定时间的Date对象作为第一个参数,任务将在指定的时间执行:

    var schedule = require('node-schedule');
    var date = new Date('2017-09-26 22:00:00');
    
    var j = schedule.scheduleJob(date, function(){
      console.log('The world is going to end today.');
    });

    RecurrenceRule实例规则定时器

    你可以通过RecurrenceRule实例声明任务触发规则:

    var schedule = require('node-schedule');
    
    var rule = new schedule.RecurrenceRule();
    rule.minute = 42;
    
    var j = schedule.scheduleJob(rule, function(){
      console.log('The answer to life, the universe, and everything!');
    });

    上面代码中,任务将在每个小时第42分钟时执行。

    我们还可以使用数组指定可接受的值列表,Range 指定起始值和结束值的范围,如下:

    var rule = new schedule.RecurrenceRule();
    rule.dayOfWeek = [0, new schedule.Range(4, 6)];
    rule.hour = 17;
    rule.minute = 0;
    
    var j = schedule.scheduleJob(rule, function(){
      console.log('Today is recognized by Rebecca Black!');
    });

    上面代码中,任务将在星期四、星期五、星期六和星期日17点整执行。

    RecurrenceRule 实例属性

    • second
    • minute
    • hour
    • date
    • month
    • year
    • dayOfWeek
    注意:实例属性中未显示设置的属性值将默认为null(除了second属性默认为0)。
    
    上例中如果我们没有显示设置minute为0,那么任务将17:00、17:01、17:02...17:59执行,这可能不是我们想要的。

    取消定时器

    示例如下,定时器对象的cancl方法即可:

    var schedule = require('node-schedule');
    
    function scheduleCancel(){
    
        var counter = 1;
        var j = schedule.scheduleJob('* * * * * *', function(){
            
            console.log('定时器触发次数:' + counter);
            counter++;
            
        });
    
        setTimeout(function() {
            console.log('定时器取消')
            j.cancel();   
        }, 5000);
        
    }
    
    scheduleCancel();

    原理

    利用setTimeOut和event事件进行管理,对所有加入的事件进行排序,并且计算当前时间和最近一个事件发生时间的时间间隔,然后调用setTimeOut设置回调。总的来说分两种事件,一种是一次性的,一种是周期性的,一次性任务调用完就结束,周期性的会不断地循环调用,当一个周期性事件被调用后,会根据周期生成下一个周期任务,并添加到任务列表中,重新排序。每个任务调用结束,都会计算并准备下一个任务。

    值得注意的一点是,在循环任务中,每个任务需要单独new一个schedule.RecurrenceRule对象,不能公用。另外就是一点网上提的比较少的一点,如果我们对循环中的时间成员没有设置,说明我们对其不感兴趣。源代码中,未设置的时间成员为null,循环结构的匹配采用的是从分钟开始的逐步累加,如果发现某成员是null,那么就直接匹配,如果不是null,就从0开始,逐渐累加,知道完全匹配。

    定时器功能大部分需求都可以借助node-schedule完成了,用它在项目中使用效果也不错,各种需求可以满足
    
    了解更多请参见:https://github.com/node-schedule/node-schedule
    
    
    
    
    
    
  • 相关阅读:
    poj 1035 (Spell checker )
    poj 3080 (暴力 strstr)
    kmp 模版
    匈牙利算法模版
    poj 1274 The Perfect Stall (最大匹配)
    hdu 1083 Courses(二分图 )
    pku 3363(内部测试赛)
    Linux 下联网脚本文件
    Qt 多国语言
    引用和引用参数
  • 原文地址:https://www.cnblogs.com/duhuo/p/4432921.html
Copyright © 2011-2022 走看看