Задания с повесткой дня, можно ли запланировать запуск задания после завершения предыдущего? - PullRequest
0 голосов
/ 28 мая 2020

Я использую заданий в nodejs. Мне было интересно, можно ли определить задание с зависимостью. В моем случае у меня есть 3 задания, каждое из которых выполняет часть целого logi c, что довольно велико, поэтому они разделены.

  1. В Job 1, Я собираю информацию из базы данных, трансформирую их и выполняю несколько задач.
  2. В Job 2 я получаю все данные, которые были ранее обработаны Job 1, и выполняю новые преобразования ..
  3. В Job 3 я снова получаю все данные, которые были обработаны в Job 2, и отправляю несколько отчетов.

У меня есть расписание этих задач, которое будет выполняться каждые 5 минут. Но дело в том, что три из них являются расписанием одновременно, потому что они планируются динамически.

job1.schedule("now");
job1.repeatEvery('5 minutes');

job2.schedule("now");
job2.repeatEvery('5 minutes');

job3.schedule("now");
job3.repeatEvery('5 minutes');

Как он настроен в настоящее время, для обработки одного экземпляра, которому требуется go через 3 задания , в худшем случае пользователю придется подождать 15 минут, что не идеально.

Мне было интересно, есть ли возможность определить, что задачи должны выполняться сразу после завершения предыдущей задачи. Я знаю, что возможный обходной путь будет заключаться в том, чтобы запланировать задания с разницей в несколько минут, но, учитывая, что в зависимости от количества экземпляров задание может потребовать больше или меньше времени, это не сработает для меня.

1 Ответ

0 голосов
/ 04 июня 2020

Я делаю довольно похожую вещь: я запускаю следующее задание, когда основная функция предыдущего задания выполнена, таким образом я могу передавать данные из одного задания в другое и запускать их последовательно.

Итак, я запускаю 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 });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...