2016年5月4日 星期三

【Quartz.net】Set Muliti trigger to single job

如果硬用 sched.ScheduleJob(job, trigger); 把不同的 trigger 塞給同一個 job 到 IScheduler instance 會噴
Unable to store Job: 'Group.Job', because one already exists with this identification.


上網查一度以為不能這樣做(好像別人不太有這個需求),實際上是可以的,有兩個重點。

首先,錯誤訊息說的是 key 重複,所以新增工作排程的時候要檢查該工作是否已存在
if (sched.CheckExists(trigger.JobKey))
    sched.ScheduleJob(trigger);
else
    sched.ScheduleJob(job, trigger);

再來,如果不是組合進去 Trigger 得預先知道自己要配給哪個 Job 所以要建造者模式進行的過程做 .ForJob(name, group)
TriggerBuilder tb = TriggerBuilder.Create();
tb.WithIdentity(tSett.Name, tSett.Group)
    .ForJob(jSett.Name, jSett.Group) // relate them before schedule
    .WithSimpleSchedule(ss =>
    {
        ...
    });
這樣就可以把多個 Trigger 指派給單一 Job 了。

沒有留言:

張貼留言