javascript - 无法使用 node-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()
被调用 - 该任务将不会在接下来被再次调用分钟。这并不意味着您之前运行的任务中的代码将停止执行!例如,如果您的代码有无限循环,停止任务不会创建更多正在运行的代码实例,但已经开始运行的实例将永远运行。这意味着您有责任确保您的代码完成运行!
推荐阅读
- python - 使用 python 执行“import mysql.connector”时出现问题(MAC OS Mojave 10.14.6)
- css - CSS中的动态绘制背景
- apache-spark - How do I filter a pyspark dataframe in a loop and append to a dataframe?
- javascript - 在外部 JS 文件中映射和渲染 axios 响应数据
- visual-studio-code - 如何删除 VSCode 上的存储库?
- amazon-web-services - Amazon EventBridge PutEvents 限制
- android-textinputlayout - 如何更改 TextInputEditText 中可绘制的位置?
- java - Android 在 onDestroy 中发送 HTTP Post
- c - 为什么在c中将指针转换为双指针?
- sql - Greoupby 与 Max() 条件 SQL Teradata