如何从kue中删除比x更早的完成的作业

我使用kue作为node.js,我看到有完整的删除作业的示例代码,但有没有办法可以删除旧的比X旧的作业? 我希望看到一两天完成的工作,以便我可以回顾一下发生的事情,但要清理比这更早的事情。

自从这个问题首先被问到,kue API似乎有了很大的改进。 我深入了一下代码,这个简单的版本适用于我:

var kue = require('kue'); kue.Job.rangeByState('complete', 0, someLargeNumber, 1, function(err, jobs) { jobs.forEach(function(job) { if (job.created_at < yourTimeThreshold) return; job.remove(); }); }); 

(为简洁起见,省略error handling。)

如果Kue提供了一个清理库中已完成作业的机制,那么将会很好,但是您可以根据每个作业的created_at字段实施一个解决scheme。 以下是我用于删除超过7天的完成的作业,每24小时扫描一次。

  var _ = require('underscore'), kue = require('kue'); var jobs = kue.createQueue(), q = new kue, // object so we can access exposed methods in the kue lib hours = 24, timer = hours * 60 * 60 * 1000; // timer for the setInterval function var completedJobs = function(callback) { /** * completedJobs - uses the kue lib .complete function to get a list of * all completed job ids, iterates through each id to retrieve the actual * job object, then pushes the object into an array for the callback. * */ q.complete(function(err, ids){ var jobs = [], count = 0, total = ids.length; console.log('completedJobs -> ids.length:%s',ids.length); _.each(ids, function(id){ kue.Job.get(id, function(err, job){ count++; jobs.push(job); if (total === count) { callback(null, jobs); return; } }); }); }); } var removeJobs = function(jobs, callback) { /** * removeJobs - removes the job from kue by calling the job.remove from the * job object collected in completedJobs(). * */ var count = 0, total = jobs.length; console.log('removeJobs -> jobs.length:%s',jobs.length); _.each(jobs, function(job) { job.remove(function(err) { count++; if (total === count) { callback(null, count); return; } }); }); } var dateDiffInDays = function(d1, d2) { /** * dateDiffInDays - returns the difference between two Date objects in days */ var t2 = d2.getTime(), t1 = d1.getTime(); return parseInt((t2-t1)/(24*3600*1000)); } setInterval(function() { /** * setInterval - calls completedJobs in a 24-hour interval */ completedJobs(function(err, jobs) { // callback to completedJobs console.log('completedJobs -> callback-> jobs.length:%s', jobs.length); var jobsToRemove = [], now = new Date(); _.each(jobs, function(job){ var then = new Date(parseInt(job.created_at)), diff = dateDiffInDays(then, now), timePastForRemoval = 7; // remove anything older than 7 days if (diff >= timePastForRemoval) { jobsToRemove.push(job); } }); console.log('completedJobs -> callback -> jobsToRemove.length:%s', jobsToRemove.length); if (jobsToRemove.length > 0) { // if we have jobsToRemove removeJobs(jobsToRemove, function(err, count){ // callback to removeJobs console.log('removeJobs -> callback -> jobs removed:%s',count); }); } else { console.log('completedJobs -> callback -> no jobs to remove'); } }); }, timer); console.log('Running kue completed job clean-up'); 

我不得不这样做,发现上面的代码有点难以遵循,我做了一个简单的方法来扩展清晰简洁的方法: https : //gist.github.com/4212207

我想从Kue中删除陈旧的工作,并修改了Chris的代码,使其在没有Underscore.js的情况下工作。

代码在这里: https : //gist.github.com/niravmehta/6112330

你可以在命令行上运行它

 node kue_cleanup 

感谢克里斯的精彩剧本! 这是一个很好的起点。