2013-08-21 133 views
2

是否可以在暫停狀態下向調度器添加觸發器?我發現如果我沒有指定開始時間,它會立即開始。創建暫停觸發器

除了立即致電scheduler.PauseJob可以通過其他方式完成嗎?

var trigger = TriggerBuilder.Create() 
    .ForJob(job) 
    .WithSimpleSchedule(schedule => schedule.WithIntervalInMinutes(1).RepeatForever()) 
    .Build(); 

scheduler.ScheduleJob(job, trigger); 

// Pause job immediately 
scheduler.PauseJob(job.Key); 

回答

1

我檢查了存儲庫,它似乎不可能。
在計劃完成之前,您無法暫停觸發器/作業。

Scheduler.PauseTriggerScheduler.PauseJob設置觸發的狀態InternalTriggerState.Pausedsee reference

我建議您安排您的觸發延遲開始一點點,並立即暫停。

var trigger = TriggerBuilder.Create() 
    .ForJob(job) 
    .WithSimpleSchedule(schedule => schedule.WithIntervalInMinutes(1).RepeatForever()) 
    .StartAt(SystemTime.UtcNow().AddSeconds(5)) 
    .Build(); 

scheduler.ScheduleJob(job, trigger); 

scheduler.PauseTrigger(trigger.Key); 
+1

它實際上是可能的觸發羣體 - 檢查我的答案。 – nollidge

+0

@nollidge:謝謝你的澄清。雖然這個答案是4歲。 – LeftyX

1

一個可能的解決方案是在觸發器生成器上使用StartAt()方法來設置特定的開始時間。

例如延遲啓動30分鐘:

var trigger = TriggerBuilder.Create() 
    .ForJob(job) 
    .WithSimpleSchedule(schedule => schedule.WithIntervalInMinutes(1).RepeatForever()) 
    .StartAt(DateTime.UtcNow.AddMinutes(30)) 
    .Build(); 
1

實際上可以用觸發組來做到這一點。您只需暫停特定的觸發組,然後創建其觸發器屬於該組的作業。

// pauses the group, if it isn't already 
scheduler.PauseTriggers(GroupMatcher<TriggerKey>.GroupEquals("PausedGroup")); 

var job = JobBuilder.Create<MyJob>().WithIdentity(jobName).Build(); 

var trigger = TriggerBuilder.Create() 
    .ForJob(job) 
    .WithIdentity(Guid.NewGuid().ToString(), "PausedGroup") 
    .WithSimpleSchedule(schedule => schedule.WithIntervalInMinutes(1).RepeatForever()) 
    .Build(); 

scheduler.ScheduleJob(job, trigger); 

然後恢復工作,重新安排每個觸發器具有不同的組:

foreach (var oldTrigger in scheduler.GetTriggers(new JobKey(jobName))) 
{ 
    // clone the old trigger with new group name 
    var newTrigger = oldTrigger.GetTriggerBuilder() 
     .WithIdentity(oldTrigger.Key.Name) // uses default trigger group name 
     .Build(); 

    // not a typo, the method to reschedule a trigger is called "RescheduleJob" for some reason 
    scheduler.RescheduleJob(oldTrigger.Key, newTrigger); 
}