Node.js Задания автообработки Kue, если очередь не пуста
Я новичок в Kue и у меня есть несколько вопросов. Надеюсь, вы можете помочь мне:)
Я прочитал все документы Кью, но я видел только один способ обработки заданий в очереди: обработка вызовов вручную. Мне нужно обрабатывать задания, как только они попадают в очередь, если очередь пуста, и запускать остальные задания после того, как было выполнено предыдущее, если очередь не пуста. Есть ли способ сделать это? Спасибо.
Или, если я перефразирую вопрос: что произойдет, если задания определенного типа закончатся из очереди? Должен ли я начать обработку заново, или она будет вызываться автоматически, как только появится новое задание?
На самом деле мне нужно своевременно распространять запросы API, так как запросы на стороне сервера ограничены.
1 ответ
Я написал небольшой сценарий JS:
var kue = require('kue')
, queue = kue.createQueue();
var job = queue.create('email', {
title: 'welcome email for tj'
, to: 'tj@learnboost.com'
, template: 'welcome-email'
}).save( function(err){
if( !err ) console.log( job.id );
});
queue.on('job enqueue', function(id, type){
console.log( 'Job %s got queued of type %s', id, type );
}).on('job complete', function(id, result){
kue.Job.get(id, function(err, job){
if (err) return;
job.remove(function(err){
if (err) throw err;
console.log('removed completed job #%d', job.id);
});
});
});
queue.process('email', function(job, done){
console.log("Processing email: " + job.data.title);
email(job.data.to, done);
});
function email(address, done)
{
done();
}
var job1 = queue.create('email', {
title: 'welcome email for tj 2'
, to: 'tj@learnboost.com'
, template: 'welcome-email'
}).save( function(err){
if( !err ) console.log( job1.id );
});
var job2 = queue.create('email', {
title: 'welcome email for tj 3'
, to: 'tj@learnboost.com'
, template: 'welcome-email'
}).save( function(err){
if( !err ) console.log( job2.id );
});
Запуск этого с node script.js
производится следующий вывод:
29
30
31
Job 29 got queued of type email
Job 30 got queued of type email
Job 31 got queued of type email
Processing email: welcome email for tj
Processing email: welcome email for tj 2
removed completed job #29
Processing email: welcome email for tj 3
removed completed job #30
removed completed job #31
Я делал это много раз (> 30). Но один раз порядок удаления был не в последовательности. Но удаление происходит асинхронно, так что это возможно.
Job 8 got queued of type email
Job 9 got queued of type email
Job 10 got queued of type email
Processing email
Processing email
removed completed job #10
Processing email
removed completed job #8
removed completed job #9
Вывод немного отличается, потому что я добавил заголовок к сообщению обработки после этого запуска. К сожалению, порядок обработки не ясен в этом примере. И я не могу это воспроизвести.:-(
РЕДАКТИРОВАТЬ
Я добавил цикл for, чтобы лучше изучить это поведение. И кель сюрприз:
Это швы работы будут процессы в лексическом порядке их идентификатора работы.
Добавленный цикл:
for (var i=0; i<20; i++)
{
var job2 = queue.create('email', {
title: 'welcome email for tj ' + (i+4)
, to: 'tj@learnboost.com'
, template: 'welcome-email'
}).save();
Новый вывод:
87
88
109
Job 87 got queued of type email
Job 88 got queued of type email
Job 89 got queued of type email
Job 90 got queued of type email
Job 91 got queued of type email
Job 92 got queued of type email
Job 93 got queued of type email
Job 94 got queued of type email
Job 95 got queued of type email
Job 96 got queued of type email
Job 97 got queued of type email
Job 98 got queued of type email
Job 99 got queued of type email
Job 100 got queued of type email
Job 101 got queued of type email
Job 102 got queued of type email
Job 103 got queued of type email
Job 104 got queued of type email
Job 105 got queued of type email
Job 106 got queued of type email
Job 107 got queued of type email
Job 108 got queued of type email
Job 109 got queued of type email
Processing email: welcome email for tj 14
Processing email: welcome email for tj 15
removed completed job #100
Processing email: welcome email for tj 16
removed completed job #101
Processing email: welcome email for tj 17
removed completed job #102
Processing email: welcome email for tj 18
removed completed job #103
Processing email: welcome email for tj 19
removed completed job #104
Processing email: welcome email for tj 20
removed completed job #105
Processing email: welcome email for tj 21
removed completed job #106
Processing email: welcome email for tj 22
removed completed job #107
Processing email: welcome email for tj 23
removed completed job #108
Processing email: welcome email for tj
removed completed job #109
Processing email: welcome email for tj 2
removed completed job #87
Processing email: welcome email for tj 3
removed completed job #88
Processing email: welcome email for tj 4
removed completed job #89
Processing email: welcome email for tj 5
removed completed job #90
Processing email: welcome email for tj 6
removed completed job #91
Processing email: welcome email for tj 7
removed completed job #92
Processing email: welcome email for tj 8
removed completed job #93
Processing email: welcome email for tj 9
removed completed job #94
Processing email: welcome email for tj 10
removed completed job #95
Processing email: welcome email for tj 11
removed completed job #96
Processing email: welcome email for tj 12
removed completed job #97
Processing email: welcome email for tj 13
removed completed job #98
removed completed job #99
Таким образом, это поведение, безусловно, будет воспроизводимым при изменении идентификатора задания с 9 на 10 с 99 на 100 с 999 на 1000 и так далее.