【问题标题】:can't stop cron job using node-cron无法使用 node-cron 停止 cron 作业
【发布时间】:2021-06-18 17:44:05
【问题描述】:

目前我正在使用 node-cron 包来安排任务。我可以让任务运行,但我不能让它停止。

我的 POST 正文是:

{
command: start/stop/destroy, 
}

代码是:

export const schedule = async (req, res) => {
    const cmd = req.body.command
    const url_taskMap = {}

    // run every midnight GMT+7
    const task = await cron.schedule(process.env.SCHEDULE_TIME, () => {
        console.log('doing task');
    }, {
        scheduled: true,
        timezone: "Asia/Bangkok"
    })

    url_taskMap['url'] = task;
    let my_job = url_taskMap['url'];


    if (cmd === 'start') {
        my_job.start()
        res.status(200).send('Task started!')
    } else if (cmd === 'stop') {
        my_job.stop()
        res.status(200).send('Task stoped!')
    } else {
        my_job.destroy()
        res.status(200).send('Task destroyed!')
    }
}

我按照https://stackoverflow.com/a/53684854/15088319 此处的答案进行操作,但任务仍在运行。我不知道如何让它停下来。你能帮帮我吗?

【问题讨论】:

    标签: javascript node.js cron


    【解决方案1】:

    我对 node-cron 不是很熟悉,但看起来这段代码有几个问题,主要问题是每个请求都会创建一个新作业,这意味着,例如,第一个请求 ( cmd: 'start') 开始一个作业,然后下一个请求 (cmd: 'stop') 创建另一个作业,然后停止另一个作业,而第一个作业将继续运行...

    为了克服这个问题,我们需要确保作业的单个实例(最多)会运行,并且当我们想要停止它时 - 我们实际上是在停止该实例。

    这可以通过持久化正在运行的作业来实现,并且在运行新作业之前首先检查我们是否没有正在运行的作业。

    第二个问题是'stop',如果我理解正确的话,会停止一个任务的调度,例如,如果一个任务被调度为每分钟运行一次,并且调用了task.stop() - 该任务不会下一分钟再次被调用。这并不意味着您之前运行的任务中的代码将停止执​​行!例如,如果您的代码有无限循环,停止任务不会创建更多正在运行的代码实例,但已经开始运行的实例将永远运行。这意味着您有责任确保您的代码完成运行!

    【讨论】:

    • 我发现,我需要将任务移动到外部函数然后我可以停止它。
    猜你喜欢
    • 1970-01-01
    • 2022-10-08
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 2019-05-10
    相关资源
    最近更新 更多