2017-08-17 6 views
1

私は、Quartz.netを使用してさまざまなAPI呼び出しをスケジュールしています。 私が使用しているAPIは、期間ごとに行うことができる要求の数を制限し、それを超えた場合、次の分のためにアカウントにペナルティが課されます(要求はありません)。Quartz.netでは、スケジュールされたすべてのジョブを一定の時間間隔でどのように遅延させることができますか?

私はあまりにも多くのリクエストを行い、次の1分間アカウントが抑制されるという通知を受け取った場合、その期間中にスケジュールされたジョブが起動しないようにする必要があります。スケジュールされたすべてのジョブの起動を1〜2分遅らせるにはどうすればよいですか?

私はもともと上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); 
} 

は、これは正しいアプローチですか単にのために、スケジューラを停止する方が良いだろう同じ期間にして再起動しますか?

+0

あなたのアプリケーションはあなたのアカウントが絞られたときを知っていますか? – Rabban

+0

@Rabban、はい、1分あたりの許容コール数を超過したために失敗した場合は、API呼び出しから特定のコードを受け取ります。その特定のコードを受け取ったとき、私たちは次の分のためにスロットルになることを知っています。 –

答えて

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を実行してジョブの実行を停止します。これを実行するには、実行の開始時にシステムが抑制されていることを確認してから、例外をスローする必要があります。これはQuartzにとって唯一の例外で、Quartzにジョブを直ちにリファイニングするよう指示することができます。他のすべての例外は飲み込まれ、ジョブの実行を停止します。 実装は次のようになります。

public class MyJob : IJob 
{ 
    public void Execute(IJobExecutionContext context) 
    { 
     if(IsSystemThrottled()) 
      throw new JobExecutionException(true); 

     // your other stuff 
    } 
} 

あなたはパラメータtrueで例外を作成した場合、ジョブはすぐに再焼成します。あなたのシステムがもはや抑制されなくなるまで、何度も何度も疲れていきます。

多くのジョブがある場合は、JobExecutionExceptionをスローするジョブベースクラスを使用することをお勧めします。ジョブはこのクラスからのみ派生します。

関連する問題