Мне бы хотелось, чтобы jobs.create
не смог выполнить идентичное задание в системе. Есть ли способ сделать это?уникальные задания с kue для node.js
Мне нужно выполнить одну и ту же работу каждые 24 часа, но некоторые задания могут занимать более 24 часов, поэтому мне нужно быть уверенным, что задание еще не в системе (активна, в очереди не выполнена) до добавив его.
ОБНОВЛЕНО: Хорошо, я собираюсь упростить проблему, чтобы иметь возможность объяснить ее здесь. Допустим, у меня есть служба аналитики, и я должен отправлять отчет своим пользователям один раз в день. Заполнение этих отчетов несколько раз (всего несколько случаев, но это возможность) занимает несколько часов даже больше, чем один день.
Мне нужен способ узнать, какие текущие задания выполняются во избежание дублирования заданий. Я не мог найти что-либо в API'''kue'''a, чтобы узнать, какие рабочие места в настоящее время работают. Также мне нужно какое-то событие, когда нужно больше рабочих мест, а затем позвоните моему продюсеру 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();
});
});
}
Дополнительная информация, код или что-то еще ... – Teemu
@Teemu Я обновил свой вопрос, спасибо! – aartiles