You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:13:24