我(天真地)试图让公牛在帆应用程序中工作:最终我希望有一个队列,我可以根据传入路线添加/删除/检查任务。
现在我了解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)环境。答案 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});