在Quartz.net,我怎么能按一定的时间间隔延迟所有计划的作业?(In Quartz.net,

2019-09-30 16:42发布

我使用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);
}

这是正确的做法或倒不如简单地停止调度用于在同一时间段,然后重新启动?

Answer 1:

你有一对夫妇的可能性,以实现这一目标。 正如你所说,你可以停止在你的触发器调度或循环。 但是,这听起来对我不喜欢的最佳选择。

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,你只能从这个类派生你的工作。



文章来源: In Quartz.net, how can I delay all scheduled jobs by a certain time span?