有没有办法在cron中立即启动一个作业,然后在执行完成后停止?
Is there a way to start a job immediately in cron and then stop it after the execution is completed?
我刚开始使用 cron,但找不到安排一次性工作的方法。
我所拥有的对我有用,但我想知道是否有更好的方法来实现它。
下面的代码创建一个作业并在控制台中打印它已创建。我每 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" (seconds min hour dayOfMonth Month DayofWeek Year) ,这将 运行 只有一次。您需要根据您希望作业 运行 的第一个 day/time 构建此表达式。如果需要立即运行,可以根据当前时间+几秒buffer
构建cron表达式
正如 snp 所建议的,我必须创建一个 cron 表达式,其中包含最近的日期加上几秒。而且,我意识到包 node-cron
与 cron
完全不同,即使它们重定向到同一个地方。
我是这样解决的:
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'});
});
我刚开始使用 cron,但找不到安排一次性工作的方法。 我所拥有的对我有用,但我想知道是否有更好的方法来实现它。
下面的代码创建一个作业并在控制台中打印它已创建。我每 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" (seconds min hour dayOfMonth Month DayofWeek Year) ,这将 运行 只有一次。您需要根据您希望作业 运行 的第一个 day/time 构建此表达式。如果需要立即运行,可以根据当前时间+几秒buffer
构建cron表达式正如 snp 所建议的,我必须创建一个 cron 表达式,其中包含最近的日期加上几秒。而且,我意识到包 node-cron
与 cron
完全不同,即使它们重定向到同一个地方。
我是这样解决的:
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'});
});