如何解决BullMQ 使用 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,但我想它与 Bull 或 Agenda 相关。所以问题是,我可以将文件本身放入队列吗?
那么在启动一个新的Worker的情况下,它会自己执行吗?
像这样:
const worker = new Worker(queueName,async (job: Job) => {
// `path/to/functionN.js`
return 'some value';
});
我知道队列是为一个典型的函数需要 args 的情况创建的,它应该由 MQ 传递来执行常规任务。但在本例中,我有各种 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
如果你在项目中使用TypeScript,那么不要忘记路径应该是编译后的JS文件,否则正确配置pm2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。