有没有一种方法可以在cron中立即启动作业,然后在执行完成后停止它



我刚开始使用cron,但我找不到安排一次性作业的方法。我所拥有的对我来说是有效的,但我想知道是否有更好的方法来实现它

下面的代码创建一个作业,并在控制台中打印该作业的创建情况。我每1秒设置一次计时器,但就在1秒以下,我会睡1.5秒来停止工作。

const express = require('express');
const cron = require('node-cron');
const router = express.Router();
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
// Schedule a job on GET
router.get('/', (req, res, next) => {
const job = cron.schedule(`*/1 * * * * *`, () => {
console.log('job created');
});
sleep(1500).then(() => {
job.stop();
})

return res.status(200).json({ message: 'scheduled'});
});

您可以构建如下的cron表达式"0 0 7 8 9?2020";(秒-分钟-小时-月-日-年-周-日(,此操作将仅运行一次。您需要根据希望作业运行的第一天/时间来构建此表达式。如果需要立即运行,可以基于当前时间+几秒缓冲区构建cron表达式

正如snp所建议的那样,我必须创建一个最近日期加上几秒的cron表达式。但是,我也意识到包node-croncron完全不同,即使它们重定向到同一个地方。

我是这样解决的:

const express = require('express');
const cron = require('cron'); // <- change of package
const router = express.Router();
const cronJob = cron.CronJob; // <- get the cron job from the package
const getDateAsCronExpression = () => { ... }
// Schedule a job on GET
router.get('/', (req, res, next) => {
const cronExpression = getDateAsCronExpression();
var job = new cronJob(cronExpression, () => {
console.log('job executed!');
}, null, true, 'your_time_zone_here');

return res.status(200).json({ message: 'scheduled'});
});

相关内容

最新更新