我希望如果系统中已经存在相同的作业,那么jobs.create会失败。是否有办法实现这一点?
我需要每24小时运行相同的作业,但有些作业可能需要超过24小时才能完成,因此在添加作业之前,我需要确保该作业尚未存在于系统中(活动、排队或失败)。
更新: 好的,我将简化问题,以便能够在这里解释。假设我有一个分析服务,我必须每天向我的用户发送一份报告。有时候(只有很少的情况,但是这是可能的),完成这些报告需要几个小时,甚至超过一天。
我需要一种方法来知道当前正在运行的作业,以避免重复作业。我在kue API中找不到任何关于哪些作业正在运行的信息。还需要某种事件触发器来获取更多的作业,然后调用我的getMoreJobs生产者。
也许我的方法是错误的,如果是这样,请告诉我更好的解决方法。
这是我的简化代码:
我需要每24小时运行相同的作业,但有些作业可能需要超过24小时才能完成,因此在添加作业之前,我需要确保该作业尚未存在于系统中(活动、排队或失败)。
更新: 好的,我将简化问题,以便能够在这里解释。假设我有一个分析服务,我必须每天向我的用户发送一份报告。有时候(只有很少的情况,但是这是可能的),完成这些报告需要几个小时,甚至超过一天。
我需要一种方法来知道当前正在运行的作业,以避免重复作业。我在kue API中找不到任何关于哪些作业正在运行的信息。还需要某种事件触发器来获取更多的作业,然后调用我的getMoreJobs生产者。
也许我的方法是错误的,如果是这样,请告诉我更好的解决方法。
这是我的简化代码:
var kue = require('kue'),
cluster = require('cluster'),
numCPUs = require('os').cpus().length;
numCPUs = CONFIG.sync.workers || numCPUs;
var jobs = kue.createQueue();
if (cluster.isMaster) {
console.log('Starting master pid:' + process.pid);
jobs.on('job complete', function(id){
kue.Job.get(id, function(err, job){
if (err || !job) return;
job.remove(function(err){
if (err) throw err;
console.log('removed completed job #%d', job.id);
});
});
function getMoreJobs() {
console.log('looking for more jobs...');
getOutdateReports(function (err, reports) {
if (err) return setTimeout(getMoreJobs, 5 * 60 * 60 * 1000);
reports.forEach(function(report) {
jobs.create('reports', {
id: report.id,
title: report.name,
params: report.params
}).attempts(5).save();
});
setTimeout(getMoreJobs, 60 * 60 * 1000);
});
}
//Create the jobs
getMoreJobs();
console.log('Starting ', numCPUs, ' workers');
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('death', function(worker) {
console.log('worker pid:' + worker.pid + ' died!'.bold.red);
});
} else {
//Process the jobs
console.log('Starting worker pid:' + process.pid);
jobs.process('reports', 20, function(job, done){
//completing my work here
veryHardWorkGeneratingReports(function(err) {
if (err) return done(err);
return done();
});
});
}