Aşağıdaki gibi boğa paketini kullanarak ayarlanmış birden fazla arka plan iş işlemcim var
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);
});
İşi cron paketini kullanarak bir Crontime'a göre çalıştırmayı denedim ancak yalnızca bir iş işlendi, lütfen aşağıdaki örneği kontrol edin
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',
});
Çalışmasını sağlamak için birçok şey denedim ama hiçbiri işe yaramıyor gibi görünüyor, aşağıda birkaçını listeleyeceğim
- bekleme kuyruğunu çalıştırıyorum.yok etmek ({kuvvet: doğru });
- çalışan işlemciyi ayrı bir örnek üzerinde çalıştırma
- iş kuyruğuna gecikme ekleyin.ekle ('test', {}, {gecikme: 500});
- iş kuyruğuna öncelik ekleme.ekle ('test', {}, {öncelik: 1});
Yukarıdaki iki İşten (test, sağlık Kontrolü) yalnızca biri her zaman tetiklenir.
diğer bir deyişle, diğeri değilken test adlı iş işlenir veya diğeri değilken iş adı healthCheckPing işlenir
Bu, aşağıdaki iş işlemcisi işlevleridir
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;
Bu kod yerel makinemde mükemmel çalışıyor, ancak bu sorun yalnızca üretim sırasında ortaya çıkar. Düğüm sunucusu pm2 kullanılarak çalıştırılır (küme modu, örnek = 1)