2

我在 nodejs 中使用议程作业。我想知道是否可以定义一个具有依赖关系的工作。就我而言,我有 3 个作业,每个作业都执行整个逻辑的一部分,这非常大,这就是它们分开的原因。

  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');

按照目前的配置,要处理一个需要完成 3 个作业的实例,最坏的情况是用户需要等待 15 分钟,这并不理想。

我想知道是否有一个选项来定义任务应该在前一个任务完成后立即执行。我知道一种可能的解决方法是安排具有几分钟差异的作业,但鉴于根据实例的数量,作业可能需要更多或更少的时间,这对我不起作用。

4

1 回答 1

1

我做类似事情的方式是,当前一个作业的主要功能完成时,我触发下一个作业,这样我可以将数据从一个作业提供给另一个作业并按顺序运行它们。

所以我job3在定义中触发并在定义中job2触发:job2job1

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

想到的另一件事是使用触发器 for completeor successjob1但是当您使用不同的输入数据运行许多相同的作业时,您不能(我还没有找到方法)监听与特定作业实例相关的那些事件你要的那个。

话虽如此,您可以这样做:

agenda.on('success:job1', (job) => {
  agenda.now('job2', { someArg: job.attrs.data.someArg });
});
于 2020-06-04T11:08:07.050 回答