bull
. में कतार में अगली नौकरी लेने से पहले विफलता के तुरंत बाद उसी कार्य को दोहराना संभव नहीं है।
समाधान:
- नया कार्य बनाएं और उसकी प्राथमिकता को वर्तमान कार्य प्रकार से कम मान पर सेट करें।
- असफल कार्य को छोड़ें (
resolve()
याdone()
) - यह नया काम
bull
द्वारा तुरंत लिया जाएगा प्रसंस्करण के लिए।
नमूना कोड:नीचे दिए गए कोड में नौकरी-3 विफल हो जाएगा और नई नौकरी का निर्माण करेगा और इसी तरह जब तक "नौकरी का उद्देश्य" किसी समय सफल नहीं हो जाता।
var Queue = require('bull');
let redisOptions = {
redis: { port: 6379, host: '127.0.0.1' }
}
var myQueue = new Queue('Linear-Queue', redisOptions);
myQueue.process('Type-1', function (job, done) {
console.log(`Processing Job-${job.id} Attempt: ${job.attemptsMade}`);
downloadFile(job, async function (error) {
if (error) {
await repeatSameJob(job, done);
} else {
done();
}
});
});
async function repeatSameJob(job, done) {
let newJob = await myQueue.add('Type-1', job.data, { ...{ priority: 1 }, ...job.opts });
console.log(`Job-${job.id} failed. Creating new Job-${newJob.id} with highest priority for same data.`);
done(true);
}
function downloadFile(job, done) {
setTimeout(async () => {
done(job.data.error)
}, job.data.time);
}
myQueue.on('completed', function (job, result) {
console.log("Completed: Job-" + job.id);
});
myQueue.on('failed', async function (job, error) {
console.log("Failed: Job-" + job.id);
});
let options = {
removeOnComplete: true, // removes job from queue on success
removeOnFail: true // removes job from queue on failure
}
for (let i = 1; i <= 5; i++) {
let error = false;
if (i == 3) { error = true; }
setTimeout(i => {
let jobData = {
time: i * 2000,
error: error,
description: `Job-${i}`
}
myQueue.add('Type-1', jobData, options);
}, i * 2000, i);
}
आउटपुट: