2012-03-14 12 views
7

Estoy usando kue para node.js y veo que hay un código de muestra para eliminar trabajos en completo, pero ¿hay alguna manera de eliminar trabajos antiguos anteriores a X? Me gustaría ver trabajos completos durante uno o dos días para poder revisar lo que ha estado sucediendo, pero para limpiar todo lo anterior.cómo eliminar trabajos completados anteriores a x desde kue

Respuesta

10

La API de kue parece haber mejorado considerablemente desde que se hizo esta pregunta por primera vez. Cavé en el código un poco y esta versión mucho más simple trabajaron para mí: (. Se omite manejo de errores para abreviar)

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

Sería bueno si Kue proporcionara un mecanismo para limpiar los trabajos completados dentro de la biblioteca, sin embargo, puede implementar una solución basada en cada campo de trabajos 'created_at'. Esto es lo que uso para eliminar trabajos completos de más de 7 días, escaneando cada 24 horas.

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

que tenía que hacer esto y encontrar el código de arriba un poco difícil de seguir, me hizo una fácil extender método claro y conciso aquí: https://gist.github.com/4212207

1

me querían para eliminar los trabajos viciado de Kue, así y modificó el código de Chris para que funcione sin Underscore.js.

El código está aquí: https://gist.github.com/niravmehta/6112330

Se puede ejecutar en la línea de comandos como

node kue_cleanup 

Gracias a Chris por su maravilloso guión! Fue un gran punto de partida.

Cuestiones relacionadas