BullMQ 使用 IIFE 从文件开始作业
BullMQ start Job from file with IIFE
假设我有一个 function1.js
(或 ts
,在这种情况下无关紧要),function2.js
和任何其他具有不同逻辑的 IIFE 文件,例如那:
(async function F() {
try {
//[1,2,..n].map(x => console.log(x));
//await any other action
} catch (e) {
console.error(e)
}
})()
我有任何作业队列管理器,在我的例子中,它是 BullMQ, but I guess it's relevant for Bull or Agenda。所以问题是,我可以将文件本身放入队列吗?
那么在启动一个新的Worker的情况下,它会自己执行吗?
像这样:
const worker = new Worker(queueName, async (job: Job) => {
// `path/to/functionN.js`
return 'some value';
});
我知道队列是为一个典型函数需要 args 的情况创建的,MQ 应该传递这些 args 来执行例行任务。但在这种情况下,我有各种 function.js
文件,想为它们管理队列。
我找到了 relative example in BullMQ docs。实际上,它被称为沙箱处理器,只有 Bull 和 BullMQ,以及其他作业队列管理器支持此功能。
其他,您需要自己编写实现。
另一种方法是使用 pm2 programmatic API 手动管理文件。在那种情况下,您将直接路径传递给 IIFE 文件,然后它已通过 pm2 执行。
const worker = new Worker('Queue', async (job: Job) => {
/**
* job.data is path to file
* not sure that await before pm2 is nessessary
*/
console.log(job.data)
await pm2.connect(err => {
if (err) console.error(err)
pm2.start({
name: 'Task Name',
script: job.data.path,
exec_mode: 'cluster',
}, (err) => {
if (err) console.error(err)
pm2.disconnect()
});
});
}, {connection: connectionRedis});
在这种情况下,您可以通过 pm2 -list command
监控您的任务
If you are using TypeScript in your project, then don't forget that path should be to the compiled JS file, otherwise configure pm2 correctly
假设我有一个 function1.js
(或 ts
,在这种情况下无关紧要),function2.js
和任何其他具有不同逻辑的 IIFE 文件,例如那:
(async function F() {
try {
//[1,2,..n].map(x => console.log(x));
//await any other action
} catch (e) {
console.error(e)
}
})()
我有任何作业队列管理器,在我的例子中,它是 BullMQ, but I guess it's relevant for Bull or Agenda。所以问题是,我可以将文件本身放入队列吗?
那么在启动一个新的Worker的情况下,它会自己执行吗?
像这样:
const worker = new Worker(queueName, async (job: Job) => {
// `path/to/functionN.js`
return 'some value';
});
我知道队列是为一个典型函数需要 args 的情况创建的,MQ 应该传递这些 args 来执行例行任务。但在这种情况下,我有各种 function.js
文件,想为它们管理队列。
我找到了 relative example in BullMQ docs。实际上,它被称为沙箱处理器,只有 Bull 和 BullMQ,以及其他作业队列管理器支持此功能。
其他,您需要自己编写实现。
另一种方法是使用 pm2 programmatic API 手动管理文件。在那种情况下,您将直接路径传递给 IIFE 文件,然后它已通过 pm2 执行。
const worker = new Worker('Queue', async (job: Job) => {
/**
* job.data is path to file
* not sure that await before pm2 is nessessary
*/
console.log(job.data)
await pm2.connect(err => {
if (err) console.error(err)
pm2.start({
name: 'Task Name',
script: job.data.path,
exec_mode: 'cluster',
}, (err) => {
if (err) console.error(err)
pm2.disconnect()
});
});
}, {connection: connectionRedis});
在这种情况下,您可以通过 pm2 -list command
If you are using TypeScript in your project, then don't forget that path should be to the compiled JS file, otherwise configure pm2 correctly