我使用Quartz.net安排各种API调用。 我使用的API限制,可以按时间段进行的请求的数量,如果超过了,那么我的账户被罚下一分钟(不要求可制成)。
如果我收到我做了太多的要求,我的帐户将被扼杀在下一分钟的通知,我需要确保没有调度作业在此期间火。 我怎样才能用一两分钟的所有预定作业的最佳延迟点火?
我本来打算叫Scheduler.GetTriggerKeys()和遍历和更新现有的每个触发器,如下所示:
foreach(var triggerKey in SchedInstance.GetTriggerKeys(GroupMatcher<TriggerKey>.AnyGroup()))
{
var oldTrigger = SchedInstance.GetTrigger(triggerKey);
TriggerBuilder tb = oldTrigger.GetTriggerBuilder();
// Update the schedule associated with the builder and build the new trigger
tb.StartAt(oldTrigger.StartTimeUtc.AddSeconds(63));
var newTrigger = tb.Build();
SchedInstance.RescheduleJob(oldTrigger.Key, newTrigger);
}
这是正确的做法或倒不如简单地停止调度用于在同一时间段,然后重新启动?
你有一对夫妇的可能性,以实现这一目标。 正如你所说,你可以停止在你的触发器调度或循环。 但是,这听起来对我不喜欢的最佳选择。
TriggerListener
您可以实现ITriggerListener
界面并使用VetoJobExecution()
方法。 实现可以是这样的:
public class SystemThrottledTriggerListener : ITriggerListener
{
public string Name => "System Throttled Trigger Listener";
public void TriggerComplete(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode)
{
// no need for implementation
}
public void TriggerFired(ITrigger trigger, IJobExecutionContext context)
{
// no need for implementation
}
public void TriggerMisfired(ITrigger trigger)
{
// no need for implementation
}
public bool VetoJobExecution(ITrigger trigger, IJobExecutionContext context)
{
// If you return true, then the Trigger is vetoed and the job is not executed.
// The Job will automatically scheduled for his next execution
return IsSystemThrottled();
}
}
然后只需将侦听器添加到您的调度,如果你的系统是节流的所有触发器都否决了:
Scheduler.ListenerManager.AddTriggerListener(new SystemThrottledTriggerListener());
JobExecutionException
你可以抛出一个JobExecutionException
停止作业的执行。 要做到这一点,你需要检查在您的系统被勒死了执行的开始,然后扔exeception。 这是石英唯一的例外,在这你可以告诉石英,它应该立即重烧工作。 所有其他异常将被吞噬,将停止作业的执行。 实现可以是这样的:
public class MyJob : IJob
{
public void Execute(IJobExecutionContext context)
{
if(IsSystemThrottled())
throw new JobExecutionException(true);
// your other stuff
}
}
如果使用参数创建异常true
,作业将立即refired。 而一次又一次地refired直到你的系统不再节流。
如果你有很多的工作,我会建议使用工作的基类,能抛出JobExecutionException,你只能从这个类派生你的工作。