最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

c# - How to Chain Quartz.NET Jobs with Individual Triggers and Ensure Sequential Execution? - Stack Overflow

programmeradmin0浏览0评论

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

发布评论

评论列表(0)

  1. 暂无评论