3

我在我的一个项目中使用kue从数据库中删除过时的锁。我能够处理单个作业,例如更新 mongoDB 中的单个文档。

var kue = require('kue')
 , queue = kue.createQueue();

queue.process('staleLocks', function(job, done){
  removeLock(job.data.id, done);
});

function removeLock(id, done) {    
  // mongoDB call
  done();
}

但是,我想通过收集队列处理后的所有 id 来一次更新所有文档。我什至可以存储所有 ID。唯一的问题是,当队列被处理时,我无法跟踪某种事件来同步整个过程。

4

1 回答 1

2

queue.inactiveCount() 如果我正确理解您的问题,我认为这里描述的队列维护功能可能会有所帮助。

您是否不能定期检查队列的长度并在计数为 0 且收集的锁的数量 > 0 时进行锁删除?就像是

// assume locksid is an array with the collected locks id
var intervalHandle = setInterval( function() {

  queue.inactiveCount(function( err, total ){
    if (!err && total === 0 && locksid.length > 0 ){
      locksid.forEach( function(lock){
        removeLock(lock);
      })
    }
  })
}, 2000 );

// somewhere else in your code, you might want
// to stop the interval check
clearInterval( intervalHandle );

由于我不知道您的工作人员是如何构建的,因此我将clearInterval()调用排除在回调之外,但如果这removeLock()是一次性任务,您甚至可以在forEach()循环完成后调用它。

我希望这有帮助。

于 2015-09-06T14:54:50.270 回答