ฉันมี หลาย พื้นหลังงานตัวประมวลผลตั้งขึ้นโดยใช้ วั สดุอย่างด้านล่างนี้
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);
});
ฉันพยายามวิ่งงานขึ้นอยู่กับ Crontime ใช้ ตารางงานของ แพกเกจแต่เพียง หนึ่ง งานได้ ถูกประมวลผลโปรดตรวจสอบตัวอย่างด้านล่างนี้
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',
});
ฉันพยายามหลายอย่างต้องทำให้มันทำงานแต่มันไม่ดูเหมือนจะทำงานจะรายชื่อบางด้านล่างนี้
- กำลัง รอคำสั่งคิวอีกobliterate({บังคับใช้:เรื่องจริง});
- งานงานหน่วยประมวลผล name บแยกตัวอย่าง
- เพิ่มหน่วงเวลาต้องทำงาน- คิวอีกเพิ่ม('ทดสอบ',{},{หน่วงเวลา:500});
- เพิ่มความสำคัญต้องทำงาน- คิวอีกเพิ่ม('ทดสอบ',{},{ความสำคัญ:1});
ออกจากสองงานพิมพ์(การทดสอบ healthCheckPing)อยู่เหนือเพียง หนึ่ง เสมได้รับการกระตุ้น
นั่นเป็นเหมือนกับงานที่ชื่อ ทดสอบ ได้ถูกประมวลผลในขณะที่อีกคนหนึ่งไม่ได้หรืองานชื่อของ healthCheckPing ได้ถูกประมวลผลในขณะที่อีกคนหนึ่งคือไม่
นี่คืองานหน่วยประมวลผล name ฟังก์ชันที่ด้านล่างนี้
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;
นี่รหัสทำงานได้เยี่ยมมาอยู่ของฉันท้องถิ่นเครื่องแต่นี่มันแตกต่างเดียว เกิดขึ้นตอนในการผลิต. คอนโหนดเซิร์ฟเวอร์สั่งการใช้ pm2(เป็นกลุ่มโหมดตัวอย่างเช่=1)