最近因需要,实现了一个nodejs版本简单计划任务框架,已开源 欢迎下载 sdb-schedule ,配套APP
Using npm:
$ npm install sdb-schedule
To run the tests:
$ node test.js
本模块是一个简洁的计划任务框架模块(基于node-schedule)。 你只需要简单的配置,就可以获得功能强大的计划任务控制功能。此模块提供了下列功能:
- 使用 Cron 格式 灵活的配置计划任务
- 可以在执行中,动态控制计划任务的开/关/更新
- 任务的配置脚本可以放在系统任意位置。
现在我们实现了一个APP sdb-schedule-ui,用于管理schedule( 只支持 redis drv ),你可以在这里下载 download.
- 基于 Eletron 实现
修复 #1
修复 使用RedisDrv时,Job启动计时记录不正确的问题。
实现 Redisdrv(redis 配置文件管理模块),使用node-redis。
重构代码,独立配置文件管理为单独的模块。现在能够更容易支持多个类型的配置文件管理。例如 使用 File/Redis/sql Server 存储管理计划任务的配置文件。
- 增加 文件类型(FileDrv.js) 配置文件管理模块。
配置文件采用json格式,定义了每个计划任务,结构大致如下:
{
"schedules":{
"enableRoom":{
"cron":"*/5 * * * * *",
"fun":"./sc/enableRoom.js",
"switch":true
},
"disableRoom":{
"cron":"*/5 * * * * *",
"fun":"./sc/disableRoom.js",
"switch":false
}
}
}
所有的工作任务在schedules域进行定义,每一个任务都有一个json对象定义,必须包含下面3个域(cron,fun和switch)。
The cron format consists of:
* * * * * *
┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ |
│ │ │ │ │ └ 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)
Currently, W
(nearest weekday), L
(last day of month/week), and #
(nth weekday
of the month) are not supported. Most other features supported by popular cron
implementations should work just fine.
cron-parser is used to parse crontab instructions.
自1.0.3版本起,配置文件管理作为了单独的模块,现在缺省提供了 文件类配置文件管理模块(FileDrv),您可以根据需求扩展配置文件管理模块,例如使用redis 管理配置模块。
我们可以在创建sdb-schedule时通过传入参数,指定使用的配置管理模块:
var app = sc({
'cfg_drv':'filedrv.js',
'cfg_opt':{
'cfgFile':"./config.json"
}
});
Using file manager the configuration.
cfg_opt:
- cfgFile,Config file path;
Using Redis manager the configuration.
cfg_opt:
- host, redis server’s host;
- port, redis server’s port;
- keyPre, redis key’s pre;
- checkInterval, check config interval, mill sec;
I am schedule framework, have two part:Frame and JobPlugin.
Job Plugin, Implement the schedule Job work.
Work flow like this:
var sc = require("sdb-schedule");
Require module sdb-schedules.var app = sc( { 'cfg_drv':'filedrv.js','cfg_opt':{} });
Construct sc object and give her ths config file path.app.run();
Call run() start work.app.stop();
Stop work.Run all job that switch is true
.
No parames.
Stop all job.
No parames.
updateJob(name,scCfg )
{
"corn":<* * * * * * *>,
"fun":"",
"switch":true|false
}
Update Job,
- If cron or fun has change,and the job is running,then restart job.
- If job not run,only change the config.
- If job not exist, add new job,but can’t run it ,you must manual run it( call runJob );
runJob(name)
stopJob(name)
getConfig(name)
Job Plugin,是一个单独的node模块,直接作为函数导出,必须包含三个参数:
module.exports = function(sc,job,isStop){}
下面是一个完整的例子,例子说明了下列特色:
module.exports = function(sc,job,isStop){
if( isStop === true ){
return stop( sc,job );
}else{
return run( sc,job );
}
};
var g_cnt = 0;
function run( sc,job)
{
console.log( 'run ' + 20002222 );
g_cnt++;
console.log( job['name'] + " " + g_cnt +" : " + job['cron'] );
if( g_cnt > 10 ){
sc.stopJob( job['name'] ); // example stop this job
}
if( g_cnt > 3 ){
sc.updateJob( job['name'], {
"cron":"*/2 * * * * *",
"fun":"./sc/enableRoom.js",
"switch":true
});
}
return 'Run OK';
}
function stop(sc,job)
{
console.log( 'stop ' + 20002222 );
return;
}
Copyright 2016+ shudingbo
Licensed under the [MIT License].