- 我有一個使用 Bullmq 佇列、調度程式和作業程式的快速應用程式。即使按下 Ctrl CI 后,仍然可以看到節點行程在我的活動管理器中運行,但終端上的服務器關閉。我知道這一點,因為即使在服務器關閉到終端之后,bulmq 任務也開始輸出 console.log 陳述句。
這就是我的 server.js 檔案的樣子
// eslint-disable-next-line import/first
import http from 'http';
import { app } from './app';
import { sessionParser } from './session';
import { websocketServer } from './ws';
import 'jobs/repeatable';
const server = http.createServer(app);
server.on('upgrade', (request, socket, head) => {
sessionParser(request, {}, () => {
websocketServer.handleUpgrade(request, socket, head, (ws) => {
websocketServer.emit('connection', ws, request);
});
});
});
server.on('listening', () => {
websocketServer.emit('listening');
});
server.on('close', () => {
websocketServer.emit('close');
});
// https://stackoverflow.com/questions/18692536/node-js-server-close-event-doesnt-appear-to-fire
process.on('SIGINT', () => {
server.close();
});
export { server };
請注意,我在上面定義了一個 SIGINT 處理程式。這是我的作業沒有退出的原因嗎?我是否必須手動關閉 SIGINT 中的每個佇列、作業程式和調度程式?我的 jobs/repeatable.js 檔案如下所示
const { scheduleJobs } = require('jobs');
if (process.env.ENABLE_JOB_QUEUE === 'true') {
scheduleJobs();
}
這是我的jobs.js 檔案
import { scheduleDeleteExpiredTokensJob } from './delete-expired-tokens';
import { scheduleDeleteNullVotesJob } from './delete-null-votes';
export async function scheduleJobs() {
await scheduleDeleteExpiredTokensJob();
await scheduleDeleteNullVotesJob();
}
這是我的 delete-expired-tokens.js 檔案,另一個非常相似
import { processor as deleteExpiredTokensProcessor } from './processor';
import { queue as deleteExpiredTokensQueue } from './queue';
import { scheduler as deleteExpiredTokensScheduler } from './scheduler';
import { worker as deleteExpiredTokensWorker } from './worker';
export async function scheduleDeleteExpiredTokensJob() {
const jobId = process.env.QUEUE_DELETE_EXPIRED_TOKENS_JOB_ID;
const jobName = process.env.QUEUE_DELETE_EXPIRED_TOKENS_JOB_NAME;
await deleteExpiredTokensQueue.add(jobName, null, {
repeat: {
cron: process.env.QUEUE_DELETE_EXPIRED_TOKENS_FREQUENCY,
jobId,
},
});
}
export {
deleteExpiredTokensProcessor,
deleteExpiredTokensQueue,
deleteExpiredTokensScheduler,
deleteExpiredTokensWorker,
};
如何優雅地關閉 Bullmq 任務佇列?
uj5u.com熱心網友回復:
你必須呼叫close()工人的方法:
server.on('close', async () => {
websocketServer.emit('close');
// Close the workers
await worker.close()
});
檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/428881.html
