Хотелось бы, чтобы jobs.create
завершился ошибкой, если идентичное задание уже есть в системе. Есть ли способ сделать это?
Мне нужно запускать одно и то же задание каждые 24 часа, но некоторые задания могут занимать даже более 24 часов, поэтому я должен быть уверен, что задание еще не находится в системе (активно, очередь не выполнена) перед добавлением это.
ОБНОВЛЕНО :
Хорошо, я собираюсь упростить проблему, чтобы иметь возможность объяснить это здесь.
Скажем так, у меня есть аналитическая служба, и я должен отправлять отчет своим пользователям один раз в день. Выполнение этих отчетов несколько раз (всего несколько случаев, но это возможно) занимает несколько часов, даже больше, чем день.
Мне нужен способ узнать, какие в настоящий момент выполняются задания, чтобы избежать дублирования заданий. Я не смог найти что-либо в 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();
});
});
}