【问题标题】:How to schedule the Job with job id and recurrence rule using node-schedule?如何使用节点计划安排具有作业 ID 和重复规则的作业?
【发布时间】:2019-08-30 12:14:22
【问题描述】:

我正在使用 node-schedule npm 包来安排作业。我参考下面的链接来设置不同工作的工作名称/ID, Cancel node-schedule event after it has been set

当我直接使用 cron 表达式来安排作业时效果很好。但是当我使用 RecurrenceRule() 来安排工作时它不起作用。

请帮我解决这个问题。

工作代码sn-p for,用job id和cron表达式调度job,

    // 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 来安排作业?

提前致谢!!!

【问题讨论】:

  • jobId 为你工作了吗?
  • 嗨@bubble-cord,是的,经过一些修改后它工作了。现在我在下面发布了我的解决方案。
  • 嗨@Shamil。感谢您的回复。我尝试使用 JobId,但似乎它现在已从当前版本的节点调度程序中删除?
  • 嗨@bubble-cord,刚才我注意到,正如你提到的,jobid 似乎已在最新版本中删除。一年前我厌倦了解决方案。

标签: node.js node-schedule


【解决方案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';
    }
}

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2017-03-14
    • 1970-01-01
    相关资源
    最近更新 更多