2012-03-14 2 views
7

Я использую kue для node.js, и я вижу, что есть образец кода для удаления заданий по завершению, но есть ли способ удалить устаревшие задания старше X? Я хотел бы видеть завершенные рабочие места в течение дня или двух, чтобы я мог просмотреть, что происходит, но для этого нужно очистить что-нибудь более старое.Как удалить завершенные задания старше x из kue

ответ

10

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(); 
    }); 
}); 

6

Было бы хорошо, если бы Kue предоставил механизм для очистки выполненных заданий в библиотеке, однако вы можете реализовать решение на основе каждого поля «created_at». Вот что я использую для удаления завершенных заданий старше 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'); 
4

Я должен был сделать это и нашел код, указанный выше немного трудно следовать, я сделал легко расширить четкий и лаконичный метод здесь: https://gist.github.com/4212207

1

Я хотел, чтобы удалить неактуальные работу с кюэ а , а также модифицированный код Криса для работы без Underscore.js.

Код здесь: https://gist.github.com/niravmehta/6112330

Вы можете запустить его в командной строке, как

node kue_cleanup 

Спасибо Крис за его прекрасный сценарий! Это была отличная отправная точка.

Смежные вопросы