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

一般可以写个定时器,来完成相应的需求,在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


												

node定时任务——node-schedule模块使用说明的更多相关文章

  1. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

  2. Node.js的Formidable模块的使用

    今天总结了下Node.js的Formidable模块的使用,下面做一些简要的说明. 1)     创建Formidable.IncomingForm对象 var form = new formidab ...

  3. Node.js入门:模块机制

    CommonJS规范      早在Netscape诞生不久后,JavaScript就一直在探索本地编程的路,Rhino是其代表产物.无奈那时服务端JavaScript走的路均是参考众多服务器端语言来 ...

  4. node 学习笔记 - Modules 模块加载系统 (1)

    本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...

  5. Node.js的net模块

    net模块提供了一个异步网络包装器,用于TCP网络编程,它包含了创建服务器和客户端的方法 创建TCP服务器 net.createServer方法 创建客户端去连接服务器 net.connect方法 简 ...

  6. 初学Node(三)模块系统

    模块系统 Node根据CommonJS规范实现了一套自己的模块机制,可以使用require()导入一个模块,使用module.exports导出一个模块. require使用 在Node中我们可以使用 ...

  7. Node.js(window)基础(2)——node环境下的模块,模块间调用

    参考:http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00143450241959 ...

  8. node(基础三)_模块系统基础

      一.前言                                                                                         这篇文章主 ...

  9. node.js中express模块创建服务器和http模块客户端发请求

    首先下载express模块,命令行输入 npm install express 1.node.js中express模块创建服务端 在js代码同文件位置新建一个文件夹(www_root),里面存放网页文 ...

  10. node.js中ws模块创建服务端和客户端,网页WebSocket客户端

    首先下载websocket模块,命令行输入 npm install ws 1.node.js中ws模块创建服务端 // 加载node上websocket模块 ws; var ws = require( ...

随机推荐

  1. C# 通过HttpWebRequest在后台对WebService进行调用

    通过HttpWebRequest在后台对WebService进行调用 http://www.cnblogs.com/macroxu-1982/archive/2009/12/23/1630415.ht ...

  2. Memcached源码分析——连接状态变化分析(drive_machine)

    这篇文章主要介绍Memcached中,基于libevent构造的主线程和worker线程所处理连接的状态互相转换的过程(不涉数据的存取等操作),也就是drive_machine的主要业务逻辑了.状态转 ...

  3. 适配高分辨率的图片High DPI Images for Variable Pixel Densities

    用最高的效率与性能提供最好的图片质量. 本文内容来至http://www.html5rocks.com/en/mobile/high-dpi/.是在这篇文章的翻译的基础上进行了总结和说明. 眼下面临的 ...

  4. QT 5.3 VS2010 中文

    #include <QtWidgets/QApplication> #include <QTextCodec>#include <QLabel>#pragma ex ...

  5. 《.NET最佳实践》

    <.NET最佳实践> 基本信息 原书名:Pro .NET Best Practices 原出版社: Apress 作者: (美)Stephen Ritchie 译者: 黄灯桥 黄浩宇 李永 ...

  6. cocos2d-x v3.0各个环境下创建项目以及编译、执行官方DEMO

    摘自:https://github.com/cocos2d/cocos2d-x/ 怎样创建一个新项目 How to start a new game Download the code from co ...

  7. feedparser win7 python 安装

    要获取订阅源读取当中的内容,Universal Feed Parser提供了非常多的API,这里说下详细的配置. 我的配置环境: win7 + python 2.7.5 步骤: 1.下载feedpar ...

  8. Spark Streaming中空batches处理的两种方法(转)

    原文链接:Spark Streaming中空batches处理的两种方法 Spark Streaming是近实时(near real time)的小批处理系统.对给定的时间间隔(interval),S ...

  9. Orchard运用 - 为博客启用Markdown编辑器

    有时决定你是否使用某一个博客系统,最看重就是如何更简便的写博客,不能让其成为一个负担或别扭费力不讨好的工作. 对此一个好的编辑器就是一个最靓丽的卖点.比如最新的博客系统ghost.org就只定位一个最 ...

  10. 裸裸的线段树(hdu 1754)

    线段树的第一发. 哪天忘了还能够让自己找找回顾. 线段树操作: build  : 建树. update:点改动: query:查询 Input 在每一个測试的第一行,有两个正整数 N 和 M ( 0& ...