如何在Quartz.NET中为单个Job配置多个Trigger?
Quartz.NET 单个Job绑定多个Trigger的正确方式
你的问题出在两次调用ScheduleJob(IJobDetail, ITrigger)——第一次调用时,Quartz会自动将Job实例存入调度器;第二次调用时,因为同名Job已经存在,所以抛出ObjectAlreadyExistsException,这和Trigger名称无关。
下面是两种正确的实现方式:
方式一:一次性绑定多个Trigger(推荐)
使用ScheduleJob(IJobDetail, IEnumerable<ITrigger>, bool?)重载,一次性将Job和多个Trigger关联并注册:
StdSchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = await factory.GetScheduler(); await scheduler.Start(); IJobDetail job = JobBuilder.Create<SampleJob>() .WithIdentity("sampleJob", "group1") .Build(); ITrigger trigger1 = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .StartNow() .Build(); ITrigger trigger2 = TriggerBuilder.Create() .WithIdentity("trigger2", "group1") .StartNow() .WithSimpleSchedule(x => x .WithIntervalInSeconds(10) .RepeatForever()) .Build(); // 一次性注册Job和多个Trigger await scheduler.ScheduleJob(job, new List<ITrigger> { trigger1, trigger2 }, true); await scheduler.Shutdown(); public class SampleJob : IJob { public async Task Execute(IJobExecutionContext context) { Console.WriteLine($"Executed {DateTime.Now}"); } }
方式二:先注册Job,再单独添加Trigger
如果需要分开操作,可以先调用AddJob注册Job(设置replace参数避免重复报错),再逐个添加Trigger:
StdSchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = await factory.GetScheduler(); await scheduler.Start(); IJobDetail job = JobBuilder.Create<SampleJob>() .WithIdentity("sampleJob", "group1") .Build(); // 先注册Job,replace设为true表示如果存在则覆盖 await scheduler.AddJob(job, true); ITrigger trigger1 = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .StartNow() .ForJob(job) // 关联到已注册的Job .Build(); ITrigger trigger2 = TriggerBuilder.Create() .WithIdentity("trigger2", "group1") .StartNow() .WithSimpleSchedule(x => x .WithIntervalInSeconds(10) .RepeatForever()) .ForJob(job) // 关联到已注册的Job .Build(); // 逐个添加Trigger await scheduler.ScheduleJob(trigger1); await scheduler.ScheduleJob(trigger2); await scheduler.Shutdown(); public class SampleJob : IJob { public async Task Execute(IJobExecutionContext context) { Console.WriteLine($"Executed {DateTime.Now}"); } }
关键说明
ScheduleJob(IJobDetail, IEnumerable<ITrigger>)会自动处理Job和Trigger的关联注册,无需担心重复问题。- 使用
AddJob时,设置replace: true可以避免Job已存在的报错;如果不希望覆盖现有Job,可以省略该参数或设为false,此时若Job已存在会抛出异常。 - 每个Trigger必须通过
ForJob显式关联到目标Job(方式二中),或者通过ScheduleJob的重载自动关联(方式一中)。
内容的提问来源于stack exchange,提问作者Takato
相关产品推荐
相关产品推荐

