Am mai multe locuri de muncă de fundal procesoare configurat folosind taur pachetul de mai jos
import { CronJob } from 'cron';
import Queue from 'bull';
let queue = new Queue('workers', {
// settings: { lockDuration: 60 * 20000 },
defaultJobOptions: {
removeOnComplete: true
},
});
queue
.on('waiting', function(jobId) {
// A Job is waiting to be processed as soon as a worker is idling.
// workerLogger.info(`Job ${jobId} waiting to be processed `);
})
.on('completed', async(job, result) => {
workerLogger.info(`Job ID: ${job.id}, Result: ${result}`);
try {
const jobbed = await queue.getJob(job.id);
if (jobbed) {
await jobbed.remove();
workerLogger.info(`removed completed job ${job.id}`);
}
} catch (error) {
throw new Error(error);
}
})
.on('failed', function(job, err) {
workerLogger.error('job ' + job.id + ' in queue failed... ' + err);
})
.on('error', function(err) {
workerLogger.error('Queue Error... ' + err);
})
.on('stalled', function(job) {
workerLogger.info(
`stalled job, restarting it again! ${job.queue.name} ${JSON.stringify(
job.data,
)} ${job.id} ${job.name}`,
);
});
queue.process('healthCheckPing', concurrency, function(job, done) {
jobs.healthCheckPing(job.data, done);
});
queue.process('test', concurrency, function(job, done) {
jobs.test(job.data, done);
});
Am încercat să fug de locuri de muncă bazate pe un Crontime folosind cron pachet, dar numai un singur loc de muncă devine prelucrate, vă rugăm să verificați eșantion de mai jos
const cron = new CronJob({
cronTime: '* * * * *',
onTick: function() {
(() => {
workerLogger.info('Pushing test to queue...');
queue.add('test');
queue.add(
'healthCheckPing',
{
jobName: 'test',
},
);
})();
},
start: true,
timeZone: 'Africa/Lagos',
});
Am încercat o mulțime de lucruri pentru a face să funcționeze dar nici unul nu pare să funcționeze, va lista câteva de mai jos
- rularea așteaptă coadă.distruge({ vigoare: true });
- rularea lucrător procesor pe o instanță separată
- adăugați întârziere la locul de muncă - coadă.adaugă('test',{}, {întârziere:500});
- adăugarea de prioritate la locul de muncă - coadă.adaugă('test',{}, {prioritatea:1});
Din cele două Locuri de munca(test, healthCheckPing) de mai sus, doar unul devine întotdeauna declanșat.
asta este, fie slujba numit test de a fi procesate în timp ce celălalt nu este, sau nume de locuri de muncă healthCheckPing fi procesate, în timp ce celălalt nu este
Acest lucru este de locuri de muncă procesor funcțiile de mai jos
const jobs = {};
jobs.test = (_, done) => {
try {
workerLogger.error('test');
done(false, 'ok');
} catch (e) {
done(e);
}
};
jobs.healthCheckPing = async({
jobName
}, done) => {
try {
workerLogger.info('health check pinger');
if (!jobName) throw new Error('uuid not passed');
// jobname is the slug for monitor
// use pingkey to negate between staging and prod monitors
const pingKey = !process.env.NODE_ENV || process.env.NODE_ENV !== 'production' ?
process.env.STAGING_HEALTH_CHECK_KEY :
process.env.PROD_HEALTH_CHECK_KEY;
const url = `https://hc-ping.com/${pingKey}/${jobName}`;
await axios.get(url);
done(false, `pinged ${jobName}!`);
} catch (error) {
done(error);
}
};
export default jobs;
Acest cod functioneaza perfect pe masina mea locale, dar această problemă numai apare atunci când pe producție. Nod server este rulat folosind pm2(modul cluster, exemplu = 1)