无法使用节点 cron 停止 cron 作业



当前我正在使用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但任务仍在运行。我不知道如何让它停下来。你能帮我吗?

我对node cron不是很熟悉,但这段代码似乎有几个问题,主要是每个请求都会创建一个新作业,这意味着,例如,第一个请求(cmd:'start'(启动了一个作业,然后下一个请求(cmd:'stop'(创建了另一个作业然后停止另一个工作,而第一个作业将继续运行。。。

为了克服这个问题,我们需要确保只有作业的一个实例(最多(会运行,当我们想停止它时,我们实际上正在停止该实例。

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

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

最新更新