| 202 | |
| 203 | let isShuttingDown = false; |
| 204 | const closeQueuesAndWorkers = async (signal) => { |
| 205 | if (isShuttingDown) { |
| 206 | return; |
| 207 | } |
| 208 | |
| 209 | isShuttingDown = true; |
| 210 | console.log(`${signal} received. Closing BullMQ workers and queues...`); // eslint-disable-line |
| 211 | |
| 212 | const workerResults = await Promise.allSettled(workersToClose.map((worker) => worker.close())); |
| 213 | workerResults |
| 214 | .filter((result) => result.status === "rejected") |
| 215 | .forEach((result) => { |
| 216 | console.error(`Failed to close worker: ${result.reason?.message || result.reason}`); // eslint-disable-line |
| 217 | }); |
| 218 | |
| 219 | const queueResults = await Promise.allSettled(queuesToClose.map((queue) => queue.close())); |
| 220 | queueResults |
| 221 | .filter((result) => result.status === "rejected") |
| 222 | .forEach((result) => { |
| 223 | console.error(`Failed to close queue: ${result.reason?.message || result.reason}`); // eslint-disable-line |
| 224 | }); |
| 225 | |
| 226 | const queueEventResults = await Promise.allSettled( |
| 227 | queueEventsToClose.map((queueEvents) => queueEvents.close()) |
| 228 | ); |
| 229 | queueEventResults |
| 230 | .filter((result) => result.status === "rejected") |
| 231 | .forEach((result) => { |
| 232 | console.error(`Failed to close queue events: ${result.reason?.message || result.reason}`); // eslint-disable-line |
| 233 | }); |
| 234 | |
| 235 | process.exit(0); |
| 236 | }; |
| 237 | |
| 238 | ["SIGINT", "SIGTERM", "SIGUSR2"].forEach((signal) => { |
| 239 | process.on(signal, () => { |