我使用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);}
不确定这是否是最好的实践。
答案 0 :(得分:0)
为什么你需要从事儿童工作?您可以只创建一个作业,创建一组异步Tasks,运行它们并等待所有提供的Task对象完成执行。
相对于quartz-documentation,目前没有“直接”或“自由”的方式来链接触发器与Quartz,但有几种方法可以不费吹灰之力完成它:
一种方法是使用一个侦听器(即TriggerListener,JobListener或SchedulerListener),它可以注意到作业/触发器的完成,然后立即安排新触发器触发。这种方法可能会涉及到一些问题,因为您必须告知监听器哪个作业遵循哪个 - 您可能需要担心此信息的持久性。请参阅随Quartz一起提供的监听器org.quartz.listeners.JobChainingJobListener - 因为它已具有部分功能。
另一种方法是构建一个Job,它在JobDataMap中包含要触发的下一个作业的名称,并且当作业完成时(execute()方法的最后一步)将作业计划下一个作业