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 или Повестка дня. Так вот вопрос, можно ли поставить в очередь сами файлы?

То есть в случае запуска нового Worker он сам себя запустит?

Как это:

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

Я понимаю, что очереди создаются для случаев, когда одной типичной функции требуются аргументы, которые MQ должен передавать для выполнения рутинных задач. Но в этом случае у меня есть различные function.js файлы и я хочу управлять очередью для них.


person AlexZeDim    schedule 13.02.2021    source источник


Ответы (1)


Я нашел относительный пример в документации BullMQ. На самом деле, это называется песочницы, и только Bull и BullMQ, среди прочих диспетчеров очередей заданий, поддерживают такую ​​возможность.

Другое, вам нужно будет написать свою собственную реализацию.

В качестве альтернативы можно использовать программный API pm2, который управляет файлами вручную. В этом случае вы передаете прямой путь к файлу с помощью 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

person AlexZeDim    schedule 16.02.2021