Bull Queue не завершается

Я новичок в Bull. Я пробовал запускать Bull на основе их кода документации. Процесс запускается, но моя работа не завершается, или я не уверен, вызывает ли он событие завершения или нет? Я не уверен, где я делаю ошибку

Прикрепление моего кода ниже

const Queue = require('bull');

const myFirstQueue = new Queue('my-first-queue', 
{
  redis: { 
      port: Config.redis.port, 
      host: Config.redis.host, 
      password: Config.redis.password 
  },
});



(async function ad() {
    const job = await myFirstQueue.add({
    foo: 'bar',
  });
})();

myFirstQueue.process(async (job, data) => {
  log.debug({ job, data }, 'Job data');
  let progress = 0;
  for (let i = 0; i < 10; i++) {
    await doSomething(data);
    progress += 10;
    job.progress(progress).catch(err => {
      log.debug({ err }, 'Job progress err');
    });
    log.debug({ progress }, 'After await');
  }

  return job;
});

const doSomething = data => {
  return new Promise((resolve, reject) => {
    return resolve(data);
  });
};

myFirstQueue.on('completed', (job, result) => {
  log.debug(`Job completed with result ${job}`);
});


myFirstQueue.on('progress', (job, progress) => {
log.debug(`Job progress with result ${job} ${progress}`);
});

Я вижу журналы, которые находятся внутри обработчика событий прогресса, но полное событие не запускается. Любая помощь приветствуется


person Kannan T    schedule 22.05.2019    source источник


Ответы (2)


вам нужно вызвать done() из процесса, тогда сработает только завершенное событие.

myFirstQueue.process(async (job, done) => {
  const data = job.data;
  let progress = 0;
  for (let i = 0; i < 10; i++) {
    await doSomething(data);
    progress += 10;

    job.progress(progress).catch(err => {
      log.debug({ err }, 'Job progress err');
    });
  }

  done();
});
person Shakir Khan    schedule 18.06.2019
comment
не могли бы вы ответить и на это stackoverflow.com/questions/64366547/ - person Shivam Verma; 15.10.2020

вы можете извлекать данные из самого объекта задания, нет необходимости передавать данные извне, для обратного вызова процесса требуется задание и данные () в качестве параметров. Вызовите обратный вызов data(), чтобы завершить работу. Вы можете передавать данные, а также Error, если они не проходят некоторые проверки. Лучшее объяснение develop/REFERENCE.md#queueprocess

  // call done when finished
  done();

  // or give a error if error
  done(new Error('error transcoding'));

  // or pass it a result
  done(null, { framerate: 29.5 /* etc... */ });

Вы можете напрямую использовать обещание, если не хотите вызывать обратный вызов done(), ref-https://github.com/OptimalBits/bull#using-promises

Сделал небольшую модификацию вашего кода, надеюсь, это поможет,

const Queue = require('bull');

const myFirstQueue = new Queue('my-first-queue');



(async function ad() {
    const job = await myFirstQueue.add({
    foo: 'bar',
  });
})();

myFirstQueue.process(async (job, done) => {
  log.debug( 'Job data ' + job.data);
  let progress = 0;
   for (let i = 0; i < 10; i++) {
    await doSomething(job.data);
    progress += 10;
    job.progress(progress).catch(err => {
      log.debug({ err }, 'Job progress err');
    });
    log.debug({ progress }, 'After await');
  }

  done(null, {done: job.data}); //we need this if we are not using promise
});

const doSomething = data => {
  return new Promise((resolve, reject) => {
    return resolve(data);
  });
};

myFirstQueue.on('completed', (job, result) => {
  log.debug(`Job completed with result ${job}`);
});


myFirstQueue.on('progress', (job, progress) => {
log.debug(`Job progress with result ${job} ${progress}`);
});
person CrazyKP    schedule 09.10.2019
comment
не могли бы вы ответить и на это stackoverflow.com/questions/64366547/ - person Shivam Verma; 15.10.2020