【问题标题】:Bull Queue is not getting completed公牛队列未完成
【发布时间】:2019-10-08 22:18:34
【问题描述】:

我是 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}`);
});

我可以看到进度事件处理程序中的日志,但未触发完成事件。任何帮助表示赞赏

【问题讨论】:

    标签: node.js queue message-queue priority-queue job-queue


    【解决方案1】:

    你需要从进程中调用 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();
    });
    

    【讨论】:

    【解决方案2】:

    您可以从job Object本身获取数据,无需外部传递数据,流程回调需要job和data()作为参数。最后调用 data() 回调来完成工作。如果某些验证失败,您可以传递数据和错误。更好的解释https://github.com/OptimalBits/bull/blob/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()回调可以直接使用promise,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}`);
    });
    

    【讨论】:

    猜你喜欢
    • 2019-12-19
    • 2023-03-12
    • 2019-09-06
    • 1970-01-01
    • 2022-01-12
    • 2019-08-22
    • 1970-01-01
    • 2016-07-28
    • 2018-05-13
    相关资源
    最近更新 更多