Node.js 如何使用节点计划安排具有作业id和重复规则的作业?
我正在使用节点计划npm包来计划作业。我参考了下面的链接来设置不同作业的作业名称/id, 当我直接使用cron表达式来安排作业时,它工作得很好。但当我使用RecurrenceRule()来安排工作时,它不起作用 请帮我解决这个问题 使用作业id和cron表达式调度作业的工作代码段Node.js 如何使用节点计划安排具有作业id和重复规则的作业?,node.js,node-schedule,Node.js,Node Schedule,我正在使用节点计划npm包来计划作业。我参考了下面的链接来设置不同作业的作业名称/id, 当我直接使用cron表达式来安排作业时,它工作得很好。但当我使用RecurrenceRule()来安排工作时,它不起作用 请帮我解决这个问题 使用作业id和cron表达式调度作业的工作代码段 // code that works function test(fn) { let rule = '* * * * *' let jobId = "my_event_1" schedule
// code that works
function test(fn)
{
let rule = '* * * * *'
let jobId = "my_event_1"
schedule.scheduleJob(jobId,rule,()=>{fn()})
}
test(print)
打印功能
function print()
{
console.log("HELLO",new Date())
}
不适用于重复规则的代码
// Recurrence rule used
function my_scheduleJob(id,tz,cron_expression,function_name)
{
var mxTimezones = "Asia/Kolkata";
var interval = parser.parseExpression(cron_expression, options);
var cronDate = interval.next();
var rule = new schedule.RecurrenceRule();
rule.second = cronDate.getSeconds();
rule.minute = cronDate.getMinutes();
rule.tz = mxTimezones; // You can specify a timezone!
schedule.scheduleJob(rule,()=>{
console.log("Scheduler test-------")
function_name(rule.tz)
})
}
my_scheduleJob("job1", "Asia/Kolkata", "* * * * *", print)
我使用重复规则的原因是设置时区。是否可以使用定期规则和作业id来安排作业
提前感谢 在正确地将cron表达式转换为递归规则后,我得到了这个问题的解决方案。希望下面的代码有帮助
// Recurrence rule used
function my_scheduleJob(id, mxTimezones, cron_expression, function_name) {
var options = {
tz: mxTimezones
};
var interval = parser.parseExpression(cron_expression, options);
var cronDate = interval.next();
var cron_attr = cron_expression.split(' ');
var rule = new schedule.RecurrenceRule();
for (var i in cron_attr) {
var res = '';
switch (i) {
case '0':
res = getRuleValue(cron_attr[i], 0, 59);
rule.minute = res == '1' ? cronDate.getMinutes() : res;
break;
case '1':
res = getRuleValue(cron_attr[i], 0, 23);
rule.hour = res == '1' ? cronDate.getHours() : res;
break;
case '2':
res = getRuleValue(cron_attr[i], 1, 31);
rule.date = res == '1' ? cronDate.getDate() : res;
break;
case '3':
res = getRuleValue(cron_attr[i], 1, 12);
rule.month = res == '1' ? cronDate.getMonth() : res;
break;
case '4':
res = getRuleValue(cron_attr[i], 0, 6);
rule.dayOfWeek = res == '1' ? cronDate.getDay() : res;
break;
}
}
rule.tz = mxTimezones; // You can specify a timezone!
let jobId = String(id)
schedule.scheduleJob(jobId, rule, () => {
console.log("Scheduler test-------")
function_name();
})
}
my_scheduleJob("job1", "Asia/Kolkata", "* * * * *", print)
function getRuleValue(value, start_value, end_value) {
if (/^[*\d][\/][\d]+$/.test(value)) {
// console.log('value:', /^[\d][\/][\d]+$/.test(value));
return new schedule.Range(start_value, end_value, parseInt(value.split('/')[1]))
}
else if (value == 'MON-FRI') {
return new schedule.Range(1, 5);
}
else if (value == '*') {
return null;
}
else {
return '1';
}
}
在正确地将cron表达式转换为递归规则之后,我得到了这个问题的解决方案。希望下面的代码有帮助
// Recurrence rule used
function my_scheduleJob(id, mxTimezones, cron_expression, function_name) {
var options = {
tz: mxTimezones
};
var interval = parser.parseExpression(cron_expression, options);
var cronDate = interval.next();
var cron_attr = cron_expression.split(' ');
var rule = new schedule.RecurrenceRule();
for (var i in cron_attr) {
var res = '';
switch (i) {
case '0':
res = getRuleValue(cron_attr[i], 0, 59);
rule.minute = res == '1' ? cronDate.getMinutes() : res;
break;
case '1':
res = getRuleValue(cron_attr[i], 0, 23);
rule.hour = res == '1' ? cronDate.getHours() : res;
break;
case '2':
res = getRuleValue(cron_attr[i], 1, 31);
rule.date = res == '1' ? cronDate.getDate() : res;
break;
case '3':
res = getRuleValue(cron_attr[i], 1, 12);
rule.month = res == '1' ? cronDate.getMonth() : res;
break;
case '4':
res = getRuleValue(cron_attr[i], 0, 6);
rule.dayOfWeek = res == '1' ? cronDate.getDay() : res;
break;
}
}
rule.tz = mxTimezones; // You can specify a timezone!
let jobId = String(id)
schedule.scheduleJob(jobId, rule, () => {
console.log("Scheduler test-------")
function_name();
})
}
my_scheduleJob("job1", "Asia/Kolkata", "* * * * *", print)
function getRuleValue(value, start_value, end_value) {
if (/^[*\d][\/][\d]+$/.test(value)) {
// console.log('value:', /^[\d][\/][\d]+$/.test(value));
return new schedule.Range(start_value, end_value, parseInt(value.split('/')[1]))
}
else if (value == 'MON-FRI') {
return new schedule.Range(1, 5);
}
else if (value == '*') {
return null;
}
else {
return '1';
}
}
jobId
对你有用吗?嗨@bubble cord,是的,经过一些修改后它就可以工作了。现在我在下面发布了我的解决方案。嗨@Shamil。谢谢你的回复。我试过使用JobId,但现在它似乎已经从当前版本的node scheduler中删除了?Hi@bubble cord,刚才我注意到,正如您提到的,JobId已经在最新版本的itseems中删除了。一年前我厌倦了下面的解决方案。jobId
对你有用吗?嗨@bubble-cord,是的,经过一些修改后它就有用了。现在我在下面发布了我的解决方案。嗨@Shamil。谢谢你的回复。我试过使用JobId,但现在它似乎已经从当前版本的node scheduler中删除了?Hi@bubble cord,刚才我注意到,正如您提到的,JobId已经在最新版本的itseems中删除了。一年前我累了。