我希望有一个简单的问题,我无法找到答案。
如果我按需安排LongRunningAndHeavyJob
类型的作业(StartNow())
我不知道这项工作将持续多长时间,但它可能很长(从10分钟到60多分钟)并且非常耗费CPU 。因为最终用户可以按需启动此作业,所以我希望确保此作业的一个实例在特定时间运行。
例如:
我如何确保Jane的工作不会与约翰的工作同时运行,并且在约翰的工作完成后运行。
属性DisallowConcurrentExecution
仅供您使用,如果您的作业具有触发器,该触发器正在重复,我认为该作业需要具有我不具备的相同键。
一些额外信息: John的工作与Jane的工作有不同的JobData。
提前致谢
答案 0 :(得分:3)
我解决了我面临的问题!
我是怎么做到的:
[DisallowConcurrentExecution]
属性Durable
个作业而没有任何触发器。JobData
而不是作业,并通过仅向ScheduleJob
方法提供触发器来计划作业(触发器使用{{1}方法)这将确保在给定时间只有1个Job的实例运行,并且如果其他人触发相同的作业,它将被安排在第一个完成后运行并且线程池中有线程可用
服务器部分:
ForJob(IJobDetail)
客户端部分:
private void RegisterManualJobs() {
var createTournamentScheduleJob = JobBuilder.Create<CreateTournamentScheduleJob>().WithIdentity("CreateTournamentSchedule", JobGroups.JG_TournamentScheduleJobs).StoreDurably().Build();
var createTournamentScheduleSingleEventJob = JobBuilder.Create<CreateTournamentScheduleSingleEventJob>().WithIdentity("CreateTournamentScheduleSingleEvent", JobGroups.JG_TournamentScheduleJobs).StoreDurably().Build();
Scheduler.AddJob(createTournamentScheduleJob,true);
Scheduler.AddJob(createTournamentScheduleSingleEventJob,true);
}
var job = Scheduler.GetJobByName("CreateTournamentSchedule", JobGroups.JG_TournamentScheduleJobs);
var trigger = TriggerBuilder.Create().StartNow().WithIdentity($"Trigger-CreateTournamentSchedule-{TournamentID}", JobGroups.JG_TournamentScheduleJobs).UsingJobData(data).ForJob(job).Build();
Scheduler.ScheduleJob(trigger);
是我在GetJobByName()