Я делаю довольно похожую вещь: я запускаю следующее задание, когда основная функция предыдущего задания выполнена, таким образом я могу передавать данные из одного задания в другое и запускать их последовательно.
Итак, я запускаю job3
в определении job2
и запускаю job2
в определении job1
:
// DEFINE JOBS
agenda.define('job1', (job) => {
return myMainJob1Function(job.attrs.data)
.then((data) => {
for (const element of data) {
agenda.now('job2', { // runs many instances of 'job2' job with distinct data
// use output data from the "parent" job
arg1: element.arg1,
arg2: element.arg2,
arg3: element.arg3,
arg4: job.attrs.data.someArg, // this will propagate an argument we set for the "parent" job
});
}
});
});
agenda.define('job2', (job) => {
return myMainJob2Function(job.attrs.data) // data supplied from 'job1'
.then((data) => {
for (const element of data) {
agenda.now('job3', { // runs many instances of 'job3' job with distinct data
// use output data from the "parent" job
arg1: element.arg1,
arg2: element.arg2,
arg3: element.arg3,
arg4: job.attrs.data.someArg, // this will propagate an argument we set for the "parent" job
});
}
});
});
agenda.define('job3', (job) => {
return myMainJob3Function(job.attrs.data) // data supplied from 'job2'
.then((data) => {
// save data to database or do something else
});
});
// TRIGGER 'job1', WHICH TRIGGERS CHILD JOBS
agenda.now('job1', { someArg: 5 }); // we're providing some initial argument, that gets passed onto child jobs
const schedule = '0 0/5 0 ? * * *' // cron expression for every 5 minutes
agenda.every(schedule, 'job1', { someArg: 5 });
Еще одна вещь, которая приходит на ум, - использование триггеров для complete
или success
из job1
, но когда вы запускаете множество одинаковых заданий с разными входными данными, вы не можете (я не нашел способа) прослушивать эти события в отношении указанного экземпляра задания c что вы хотите.
При этом вы можете:
agenda.on('success:job1', (job) => {
agenda.now('job2', { someArg: job.attrs.data.someArg });
});