I am using Quartz.NET to schedule a series of jobs that need to be executed in sequence. I want each job to have its own trigger so that I can see the execution status of them in the UI (localhost:****/quartz), but I want to ensure that each job waits for the previous job to complete before starting. I have tried using JobChainingJobListener, but it doesn't seem to work as the jobs are scheduled with .StartNow() even though they are chained. Here is my current setup:
public static IScheduler RegisterJobs(IScheduler scheduler, IapConfiguration config)
{
#region Upload Group scheduling
var uploadGroup = "UploadGroup";
// Create Job Keys
JobKey uploadJobKey1 = JobKey.Create(JobConstant.Upload_IGRecChannel, uploadGroup);
JobKey uploadJobKey2 = JobKey.Create(JobConstant.Upload_Languages, uploadGroup);
JobKey uploadJobKey3 = JobKey.Create(JobConstant.Upload_Education, uploadGroup);
JobKey uploadJobKey4 = JobKey.Create(JobConstant.Upload_IntWorkExperience, uploadGroup);
JobKey uploadJobKey5 = JobKey.Create(JobConstant.Upload_ExtWorkExperience, uploadGroup);
// Create Job Details
IJobDetail uploadJob1 = JobBuilder.Create<JobService>()
.WithIdentity(uploadJobKey1)
.StoreDurably(true)
.Build();
IJobDetail uploadJob2 = JobBuilder.Create<JobService>()
.WithIdentity(uploadJobKey2)
.StoreDurably(true)
.Build();
IJobDetail uploadJob3 = JobBuilder.Create<JobService>()
.WithIdentity(uploadJobKey3)
.StoreDurably(true)
.Build();
IJobDetail uploadJob4 = JobBuilder.Create<JobService>()
.WithIdentity(uploadJobKey4)
.StoreDurably(true)
.Build();
IJobDetail uploadJob5 = JobBuilder.Create<JobService>()
.WithIdentity(uploadJobKey5)
.StoreDurably(true)
.Build();
// Create Triggers for each job
ITrigger uploadJobTrigger1 = TriggerBuilder.Create()
.WithIdentity(JobConstant.Upload_IGRecChannel + "Trigger", uploadGroup)
.WithCronSchedule(config.UploadGroupCron)
.Build();
ITrigger uploadJobTrigger2 = TriggerBuilder.Create()
.WithIdentity(JobConstant.Upload_Languages + "Trigger", uploadGroup)
.StartNow()
.Build();
ITrigger uploadJobTrigger3 = TriggerBuilder.Create()
.WithIdentity(JobConstant.Upload_Education + "Trigger", uploadGroup)
.StartNow()
.Build();
ITrigger uploadJobTrigger4 = TriggerBuilder.Create()
.WithIdentity(JobConstant.Upload_IntWorkExperience + "Trigger", uploadGroup)
.StartNow()
.Build();
ITrigger uploadJobTrigger5 = TriggerBuilder.Create()
.WithIdentity(JobConstant.Upload_ExtWorkExperience + "Trigger", uploadGroup)
.StartNow()
.Build();
// Configure Job Listener for chaining
JobChainingJobListener listener2 = new JobChainingJobListener("Upload Chain");
listener2.AddJobChainLink(uploadJobKey1, uploadJobKey2);
listener2.AddJobChainLink(uploadJobKey2, uploadJobKey3);
listener2.AddJobChainLink(uploadJobKey3, uploadJobKey4);
listener2.AddJobChainLink(uploadJobKey4, uploadJobKey5);
scheduler.ListenerManager.AddJobListener(listener2, GroupMatcher<JobKey>.GroupEquals(uploadGroup));
// Schedule the first job with its trigger
scheduler.ScheduleJob(uploadJob1, uploadJobTrigger1);
scheduler.ScheduleJob(uploadJob2, uploadJobTrigger2);
scheduler.ScheduleJob(uploadJob3, uploadJobTrigger3);
scheduler.ScheduleJob(uploadJob4, uploadJobTrigger4);
scheduler.ScheduleJob(uploadJob5, uploadJobTrigger5);
return scheduler;
#endregion Upload Group scheduling
}
If I simply use something like below, the triggers are not showing up on the UI (which is obvious)
ITrigger uploadJobTrigger1 = TriggerBuilder.Create()
.WithIdentity(JobConstant.Upload_IGRecChannel + "Trigger", uploadGroup)
.WithCronSchedule(config.UploadGroupCron)
.Build();
// Configure Job Listener for chaining
JobChainingJobListener listener2 = new JobChainingJobListener("Upload Chain");
listener2.AddJobChainLink(uploadJobKey1, uploadJobKey2);
listener2.AddJobChainLink(uploadJobKey2, uploadJobKey3);
listener2.AddJobChainLink(uploadJobKey3, uploadJobKey4);
listener2.AddJobChainLink(uploadJobKey4, uploadJobKey5);
scheduler.ListenerManager.AddJobListener(listener2, GroupMatcher<JobKey>.GroupEquals(uploadGroup));
// Schedule and add jobs sequentially
scheduler.ScheduleJob(uploadJob1, uploadJobTrigger1);
scheduler.AddJob(uploadJob2, false, true);
scheduler.AddJob(uploadJob3, false, true);
scheduler.AddJob(uploadJob4, false, true);
scheduler.AddJob(uploadJob5, false, true);
Here is just an example of how UI looks with triggers and job statuses