sailsjs中的公牛任务不起作用?

时间:2018-01-15 15:45:35

标签: javascript sails.js scheduled-tasks bull.js

我(天真地)试图让公牛在帆应用程序中工作:最终我希望有一个队列,我可以根据传入路线添加/删除/检查任务。

现在我了解sails创建一个全局运行的排队系统,我必须在bootstrap.js中添加此设置。

/**
 * Bootstrap
 * (sails.config.bootstrap)
 *
 * An asynchronous bootstrap function that runs before your Sails app gets lifted.
 * This gives you an opportunity to set up your data model, run jobs, or perform some special logic.
 *
 * For more information on bootstrapping your app, check out:
 * https://sailsjs.com/config/bootstrap
 */
module.exports.bootstrap = function(done) {

  // It's very important to trigger this callback method when you are finished
  // with the bootstrap!  (otherwise your server will never lift, since it's waiting on the bootstrap)
  let Queue = require('bull');
  let q = new Queue('test queue');
  q.process(function(job, done){
    console.log("starting job");
    for(let i = 0; i<job.value; i+=1) {
      console.log(i);
    }
    done();
  });
  q.add({'value':10});
  global.DirectUpdateQueue = q;
  return done();

};

鉴于上面的代码,sails启动完全正常,在路线中我可以看到global.DirectUpdateQueue已存在。

但不起作用的是排队的任务被执行。 - 我没有看到控制台中的任何日志(至少预期“启动作业”)。如果在处理函数中放置断点,代码也不会中断。

那么这里发生了什么?

编辑:这可能是因为我没有设置(本地)redis服务器吗? - 我没有找到关于这个主题的任何信息,但我希望/希望bull.js在内部实际处理这个服务器,并且(更重要的是)不限于特定的(OS)环境。

3 个答案:

答案 0 :(得分:0)

首先,您必须连接到Redis服务器

var testQueue = new Queue('test', {
  redis: {
    port: 6379,
    host: '127.0.0.1',
    password: 'secret'
  }
});

根据the doc

  

如果队列为空,则直接执行作业,否则它将被放入队列并尽快执行。

要访问作业中的数据,请使用job.data对象:

testQueue.process((job) => {
  console.log("job with data 'foo' :", job.data.foo);

  // example with Promise
  return asynchTreatment()
  .then(() => { console.log('treatment ok'); })
  .catch((err) => { console.log('treatment ko :', err); }
}).on('completed', (job, result) => {
  // Job completed with output result!
  console.log('result :', result);
});

testQueue.add({ foo : 'bar' });

编辑1:

医生说:

  

它会创建一个在Redis中保留的新队列。每次实例化相同的队列时,它都会尝试处理以前未完成的会话中可能存在的所有旧作业。

因此,如果服务器重启,您不会丢失工作。

答案 1 :(得分:0)

只需在for循环中使用job.data.value

for(let i = 0; i<job.data.value; i+=1) {
  console.log(i);
}

答案 2 :(得分:0)

因此,首先,必须确保服务器上已安装Redis。 创建队列时,您可以在下面的示例中将Redis配置作为默认值传递。

然后在bootsrap.js中:

  var Queue = require('bull');
  var testQueue = new Queue('Website Queue', 'redis://127.0.0.1:6379');
  testQueue.process(function(job, done){

    console.log('job started');

    setTimeout(function () {

        console.log('10 seconds later');
        console.log(job.data);

    }, 10000)

    done(); 
    });    

  global.testQueue = testQueue; 

然后从操作/控制器中执行以下操作:

testQueue.add({'value':10});