我希望jobs.create
失敗,如果一個相同的工作已經在系統中。有什麼辦法可以實現這個嗎?kue for node.js的獨特工作
我需要每24小時運行一次相同的作業,但有些作業甚至可能需要24小時以上,所以我需要確保作業尚未在系統中(活動,排隊o失敗)添加它。
已更新: 好的,我將簡化問題,以便能夠在這裏解釋它。 唯恐我有一個分析服務,我必須每天向我的用戶發送一次報告。有時完成這些報告(只有少數情況,但有可能)需要幾個小時甚至一天以上。
我需要一種方法來知道哪些是當前正在運行的作業,以避免重複作業。我找不到'''''''''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();
});
});
}
需要更多信息,代碼或其他... – Teemu 2012-01-27 11:45:32
@Teemu我已更新我的問題,謝謝! – aartiles 2012-01-27 12:38:51