2013-02-03 12 views
8

Używam kue dla mojej kolejki zadań i chciałbym się dowiedzieć, bez użycia GUI, ile jeszcze zadań zostało, ile się nie udało itd. Jak mogę odzyskać tego rodzaju informacje?Jak odzyskać zadania o określonym statusie w kue?

Na przykład, po kilku minutach od rozpoczęcia przetwarzania kolejki zadań, chciałbym zaktualizować stan wszystkich zadań, które do tej pory nie powiodły się "nieaktywne", w celu ich ponownego uruchomienia.

Jedyne powiązane pytanie, które można znaleźć na stackoverflow to this, jednak zajmuje się jedną pracę na raz, po uruchomieniu pewnego zdarzenia, ponieważ jest przetwarzany. Moja troska jest inna, ponieważ jestem zainteresowany pobieraniem wszystkich zadań w bazie danych z pewnym statusem.

W odpowiedzi na this question wspomniano o funkcji. Kompletna biblioteka kue, która pobiera wszystkie wykonane zadania z bazy danych. Czy są podobne funkcje dla innych możliwych stanów pracy?

Odpowiedz

17

Znalazłem rozwiązanie, przeglądając kod źródłowy kue. Poniższy kod osiąga to, czego potrzebuję:

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

Dla porównania, tutaj jest odpowiedni kod źródłowy 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)); 
}; 

kod źródłowy Kue wskazujące, że:

  • type to typ pracy
  • from, to jest praca w zakresie od indeksu (na przykład, można określić obciążenia pracy z indeksem 0 do 10, 11 miejsc pracy w sumie).
  • order określa kolejność idących pracy. Domyślna wartość to asc. Możesz także posortować go przez desc
+0

działa to dobrze na localhost. Ale używając wewnętrznych funkcji, rangeByType utworzy w rzeczywistości nowego RedisClient (przypisanego do localhost, domyślnie) i nie użyje tego dostarczonego do kue. To sprawia, że ​​trudno jest zrobić to z Redis na innym hoście. Moim rozwiązaniem jest bezpośrednie zapytanie do redis (z kodem podanym w rangeByType) – japrescott