首页 > 解决方案 > 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,但我想它与BullAgenda相关。所以问题是,我可以将文件本身放入队列中吗?

那么在启动一个新的Worker的情况下,它会自行执行吗?

像这样:

const worker = new Worker(queueName, async (job: Job) => {
    // `path/to/functionN.js`
    return 'some value';
});

我知道队列是为一个典型函数需要 args 的情况而创建的,应该由 MQ 传递它来执行例行任务。但在这种情况下,我有各种function.js文件,想为它们管理队列。

标签: javascriptnode.jschild-processiifebullmq

解决方案


在 BullMQ docs 中找到了一个相对示例。实际上,它被称为沙箱处理器,并且只有 Bull 和 BullMQ 以及其他任何作业队列管理器支持此功能。

其他,您需要编写自己的实现。

另一种方法是使用pm2 编程 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


推荐阅读