J'ai plusieurs tâches en arrière-plan processeurs configurés à l'aide du taureau paquet comme ci-dessous
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);
});
J'ai essayé de lancer le travail basé sur une Crontime à l'aide de la cron paquet, mais seulement un travail est traitée, veuillez consulter l'exemple ci-dessous
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',
});
J'ai essayé beaucoup de choses pour le faire fonctionner, mais aucun ne semble fonctionner, une liste non exhaustive ci-dessous
- l'exécution de l'attendent en file d'attente.effacer({ force: true });
- l'exécution de l'ouvrier processeur sur une instance distincte
- ajouter du retard à l'emploi de la file d'attente.add('test',{}, {delay:500});
- l'ajout de la priorité à l'emploi de la file d'attente.add('test',{}, {priorité:1});
En dehors des deux Emplois(test, healthCheckPing) ci-dessus, seulement une toujours est déclenché.
qui est, soit le travail appelé test de traiter, tandis que l'autre ne l'est pas, ou le nom de la tâche healthCheckPing traités, tandis que l'autre n'est pas
C'est l'emploi processeur fonctions ci-dessous
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;
Ce code fonctionne parfaitement sur ma machine locale, mais seulement sur ce problème se produit lorsque la production. Le nœud du serveur est exécuté à l'aide de pm2(mode cluster, instance = 1)