是否可以在暂停状态下为调度程序添加触发器?我发现如果我没有指定开始时间,它会立即开始。
除了立即致电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);
答案 0 :(得分:2)
实际上可以使用触发器组执行此操作。您只需要暂停特定的触发器组,然后创建一个其触发器属于该组的作业。
// 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);
}
答案 1 :(得分:1)
一种可能的解决方案是使用触发器构建器上的StartAt()方法来设置特定的开始时间。
e.g。延迟开始30分钟:
var trigger = TriggerBuilder.Create()
.ForJob(job)
.WithSimpleSchedule(schedule => schedule.WithIntervalInMinutes(1).RepeatForever())
.StartAt(DateTime.UtcNow.AddMinutes(30))
.Build();
答案 2 :(得分:1)
我检查了存储库,但似乎不可能 在计划之前,您无法暂停触发器/作业。
Scheduler.PauseTrigger
和Scheduler.PauseJob
将触发器的状态设置为InternalTriggerState.Paused
(see 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);