【问题标题】:How to stop a node cron job如何停止节点 cron 作业
【发布时间】:2019-05-10 02:43:35
【问题描述】:

我想在特定条件下停止节点 cron 作业。

这就是我开始每 1 秒运行一次任务的方式。

const runScheduler = (url)=>{
    cron.schedule('*/1 * * * * *', () => {
        console.log('running a task every one second');
        async.waterfall([ getUrlDelay(url), dbMethods.updateUrlResponses(url) ],function(err, success){
            if(err) return console.log('Url Not Found');
        })
      });
}

我想停止这项工作,但无法完成。

【问题讨论】:

    标签: node.js node-cron


    【解决方案1】:
    var cron = require('node-cron');
    
      var task = cron.schedule('* * * * *', () =>  {
        console.log('will execute every minute until stopped');
    });
    task.stop(); 
    

    【讨论】:

    • 实际上我的程序中有很多工作正在运行。正在为不同的 url 调用此函数 (runScheduler)。我只想停止特定 url 的工作。
    【解决方案2】:

    由于对这些软件包所做的更改,以下答案现在可能不相关。 scheduleJob 是用来创建工作的伪代码。目的是展示如何阻止他们。


    以下是针对三个 cron 模块(cronnode-cronnode-schedule)实例化、启动和停止调度的 cron 作业的综合摘要:

    1. CRON

    为了cancel 作业,您可以创建一个具有唯一名称的作业。

    var cron = require('cron').CronJob;
    
    var j = cron.scheduleJob(unique_name, '*/1 * * * * *',()=>{
        //Do some work
    });
    // for some condition in some code
    let my_job = cron.scheduledJobs[unique_name];
    my_job.stop();
    

    它应该取消作业。

    2。 NODE-CRON

    var cron = require('node-cron');
    
    const url_taskMap = {};
    const task = cron.schedule('*/1 * * * * *',()=>{
        //Foo the bar..
    });
    url_taskMap[url] = task;
    // for some condition in some code
    let my_job = url_taskMap[url];
    my_job.stop();
    

    3.节点时间表

    var schedule = require('node-schedule');
    
    let uniqueJobName = specificURL;
    // Shedule job according to timed according to cron expression
    var job = schedule.scheduleJob(uniqueJobName,'*/10 * * * * *', function(){
         //Bar the foo..
    });
    // Inspect the job object (i.E.: job.name etc.)
    console.log(`************** JOB: ******************`);
    console.log(job);
    
    // To cancel the job on a certain condition (uniqueJobName must be known) 
    if (<someCondition>) {
        let current_job = schedule.scheduledJobs[uniqueJobName];
        current_job.cancel();
    }
    

    Aritra Chakraborty & ILuvLogix总结

    【讨论】:

    • 对于 node-cron,@amoghesturi 的解决方案有效。它还有一个cron.getTasks() 方法,每个任务都有一个.start.stop 方法。
    • 我目前在作业实例化(通过 mqtt 的 IOT 发布)和终止方面遇到了类似的问题。感谢您的信息-也许我们可以将您的答案扩展到涵盖 cron、node-cron 和 node shedule-这将是未来的一个很好的参考-您怎么看?
    • 欢迎您编辑答案。我一定会批准的。 :-)
    • np - 无论如何,声誉只是指向我 - 我把我们的功劳放在了底部;)请检查摘要是否有任何错误或拼写错误,如果发现任何错误或拼写错误,请进行编辑;)
    • 某些方法签名似乎不正确。 require('cron').CronJob 没有方法“scheduleJob”,也没有 require('node-cron')
    【解决方案3】:

    我成功使用cron-job-manager 创建、读取、更新、删除作业。

    添加工作后manager.add('key','* 30 * * * *', taskFunction) 您可以轻松地停止它manager.stop('key') 或删除它manager.deleteJob('key')

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题。使用node-schedule 解决了每个作业自定义ID 的问题:

      启动自定义作业:

        const campaignId = "MY_CUSTOM_ID"
        let job = schedule.scheduleJob(campaignId, '* * * * * *', function () {
          console.log('running campaign: ' + campaignId)
        })
      

      停止自定义作业:

        const campaignId = "MY_CUSTOM_ID"
        let current_job = schedule.scheduledJobs[campaignId]
        current_job.cancel()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-30
        • 2011-05-28
        • 2013-10-22
        • 1970-01-01
        • 1970-01-01
        • 2021-06-18
        • 2018-05-02
        • 1970-01-01
        相关资源
        最近更新 更多