2013-02-03 28 views
8

我正在使用kue作为我的工作队列,并且我想知道不使用GUI仍有多少作业,有多少作业失败等。我如何获取这类信息?如何在kue中以特定状态取回作业?

例如,在开始处理作业队列几分钟后,我想将迄今为止失败的所有作业的状态更新为“非活动”状态,以便重新启动它们。

我可以在stackoverflow上找到的唯一相关问题是this,但是,它在处理某个事件时会触发某个事件。我的担忧是不同的,因为我有兴趣检索具有特定状态的数据库中的所有作业。

this question的回答提到了kue库的函数.complete,该函数检索数据库中所有已完成的作业。其他可能的工作状态是否有类似的功能?

回答

17

我通过浏览kue源代码找到了解决方案。下面的代码实现了我所需要的:

var redis = require ('redis'), 
    kue = require ('kue'), 
    redisClient = redis.createClient(6379, "127.0.0.1"); 

kue.redis.createClient = function() { 
    return redisClient; 
}; 

kue.app.listen(3000); 


kue.Job.rangeByType ('job', 'failed', 0, 10, 'asc', function (err, selectedJobs) { 
    selectedJobs.forEach(function (job) { 
     job.state('inactive').save(); 
    }); 
}); 

仅供参考,这里是有关KUE源代码:

/queue/job.js:123:

/** 
* Get jobs of `type` and `state`, with the range `from`..`to` 
* and invoke callback `fn(err, ids)`. 
* 
* @param {String} type 
* @param {String} state 
* @param {Number} from 
* @param {Number} to 
* @param {String} order 
* @param {Function} fn 
* @api public 
*/ 

exports.rangeByType = function(type, state, from, to, order, fn){ 
    redis.client().zrange('q:jobs:' + type + ':' + state, from, to, get(fn, order)); 
}; 

苦厄源代码表明:

  • type是工作类型
  • fromto是作业通过指数范围(例如,可以从索引0指定负载作业10中,共有11个作业。)
  • order指定取出作业的顺序。默认是asc。您也可以按照desc
+0

这个工作良好的本地主机。但通过使用内部函数,rangeByType实际上会创建一个新的RedisClient(绑定到localhost,默认),而不是使用提供给kue的那个。这使得使用其他主机上的redis很难做到这一点。我的解决方案是直接查询redis(使用rangeByType中提供的代码) – japrescott