Quartz.NET
1.如下是一个按顺序执行的单一工作链
2.问题:如果要重复该工作链多次(只是参数不同),怎样判断上一个触发已经结束呢?正确的方法是怎样呢?
// Get scheduler and add object
IScheduler scheduler = MySchedulerFactory.GetScheduler();
JobKey firstJobKey = JobKey.Create("FirstJob", "Pipeline");
JobKey secondJobKey = JobKey.Create("SecondJob", "Pipeline");
JobKey thirdJobKey = JobKey.Create("ThirdJob", "Pipeline");
// Create job and trigger
IJobDetail firstJob = JobBuilder.Create<FeedingJob.OuterJob>()
.WithIdentity(firstJobKey)
.UsingJobData("outerSays", "Hello World,I'm outSide!")
//.StoreDurably(true)
.Build();
IJobDetail secondJob = JobBuilder.Create<FeedingJob.InnnerJob1>()
.WithIdentity(secondJobKey)
.UsingJobData("innerSays", "Hello World,I'm inSide1!")
.UsingJobData("executeNext", "false")
.StoreDurably(true)//指示Quartz在Job成为“孤儿”时不要删除Job(当Job不再有Trigger引用它时),按顺序触发关键
.Build();
IJobDetail thirdJob = JobBuilder.Create<FeedingJob.InnnerJob1>()
.WithIdentity(thirdJobKey)
.UsingJobData("innerSays", "Hello World,I'm inSide2!")
.UsingJobData("executeNext", "true")
.StoreDurably(true)
.Build();
ITrigger firstJobTrigger = TriggerBuilder.Create()
.WithIdentity("Trigger", "Pipeline")
.WithSimpleSchedule(x => x
.WithMisfireHandlingInstructionFireNow()
.WithIntervalInSeconds(15)
.WithRepeatCount(30000)).StartAt(DateBuilder.FutureDate(1, IntervalUnit.Second))
.Build();
JobChainingJobListener listener = new JobChainingJobListener("Pipeline Chain");
listener.AddJobChainLink(firstJobKey, secondJobKey);
listener.AddJobChainLink(secondJobKey, thirdJobKey);
scheduler.ListenerManager.AddJobListener(listener, GroupMatcher<JobKey>.GroupEquals("Pipeline"));
// Run it all in chain
scheduler.Start();
scheduler.ScheduleJob(firstJob, firstJobTrigger);
scheduler.AddJob(secondJob, false, true);
scheduler.AddJob(thirdJob, false, true);
public class FeedingJob
{
//[DisallowConcurrentExecution]
public class OuterJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
JobKey jobKey = context.JobDetail.Key;
JobDataMap dataMap = context.JobDetail.JobDataMap;
string jobSays = dataMap.GetString("outerSays");
Console.WriteLine($"Outer job executed[{jobKey}]:{DateTime.Now},Content:{jobSays}");
Thread.Sleep(2000);
return Task.CompletedTask;
}
}
//[DisallowConcurrentExecution]
public class InnnerJob1 : IJob
{
public Task Execute(IJobExecutionContext context)
{
JobKey jobKey = context.JobDetail.Key;
JobDataMap dataMap = context.JobDetail.JobDataMap;
string jobSays = dataMap.GetString("innerSays");
string executeNext = dataMap.GetString("executeNext");
Console.WriteLine($"Innner job executed[{jobKey}]:{DateTime.Now},Content:{jobSays},executeNext:{executeNext}");
Thread.Sleep(2000);
return Task.CompletedTask;
}
}
}