Quartz.net中是否存在Parent-Child工作概念

时间:2016-08-26 06:48:06

标签: c# quartz-scheduler quartz.net

我使用Quartz.net调度程序从一个数据库迁移到另一个数据库。我想为每个数据库表数据传输启动一个单独的作业。我有一个父作业进行数据迁移,触发每个表的子作业。我希望父作业等待所有子作业完成但是现在当我开始父作业时,它会触发所有继续运行的子作业,但是一旦它触发所有作业就完成父作业。 提前谢谢..

示例代码如下所示

 public class DataMigrationJob : IJob
   {
    public void Execute(IJobExecutionContext context)
    {

        List<string> tableList  = somelist;
        foreach (var table in tableList)
        {
           JobDetailImpl job = new JobDetailImpl(jobKey, groupName, tableJobType,    true, true);
        if (!SchedulerProvider.Scheduler.CheckExists(job.Key))
        {
            context.Scheduler.AddJob(job, true, true);
        }
        context.Scheduler.TriggerJob(job.Key);
        }
    }             
}      

在所有儿童工作完成之前,是否有正确的方法让父母工作继续?

我有一个想法是通过使用while循环来使其工作,这将调用条件中的函数并添加等待,如下所示

    public boolena AllChildrenJobCompleted(IJobExecutionContext context,             List<JobKey> jobKeys)        
    {
      runningJobsList = context.Scheduler.GetCurrentlyExecutingJobs();
      //check if children jobs are part of this list
      //return false until list contains any of the child job
      //return true when list does not contain child jobs
    }

稍后可以在父作业的执行功能中调用此函数,如此

      while(!AllChildrenJobCompleted(context,childJobs))
         {wait(1000);}

不确定这是否是最好的实践。

1 个答案:

答案 0 :(得分:0)

为什么你需要从事儿童工作?您可以只创建一个作业,创建一组异步Tasks,运行它们并等待所有提供的Task对象完成执行。

相对于quartz-documentation,目前没有“直接”或“自由”的方式来链接触发器与Quartz,但有几种方法可以不费吹灰之力完成它:

  
      
  • 一种方法是使用一个侦听器(即TriggerListener,JobListener或SchedulerListener),它可以注意到作业/触发器的完成,然后立即安排新触发器触发。这种方法可能会涉及到一些问题,因为您必须告知监听器哪个作业遵循哪个 - 您可能需要担心此信息的持久性。请参阅随Quartz一起提供的监听器org.quartz.listeners.JobChainingJobListener - 因为它已具有部分功能。

  •   
  • 另一种方法是构建一个Job,它在JobDataMap中包含要触发的下一个作业的名称,并且当作业完成时(execute()方法的最后一步)将作业计划下一个作业

  •