2017-01-11 7 views
2

私はいくつかの条件に基づいて電子メールを自動的に送信するために、C#.Net WebサイトにQuartz.netライブラリを含めました。私はRepeatForever()で仕事を始めました。私はデータベースからスケジューラの設定を取得しています。ジョブが既に開始されているときは、データベース内のスケジューラの設定が変更されているかどうかを確認する必要があります。スケジューラが新しい設定を動的に実行できるように、これまで私はこれをしています:C#でQuartzジョブスケジューラをデータベースから動的に再スケジュールする方法は?

public void StartJob() 
    { 
     var reminderSettings = GetReminderSettings(); //getting these settings from database 
     var count = GetUnpaidInvoicesListCount(); 
     var intervalBtwnReminders = 0; 
     if (reminderSettings?.RemindersGap != null) 
     { 
      intervalBtwnReminders = (int)(reminderSettings.RemindersGap);   
     } 

     ISchedulerFactory schedFact = new StdSchedulerFactory(); 

     IScheduler sched = schedFact.GetScheduler(); 
     sched.Start(); 

     // create job 
     IJobDetail job = JobBuilder.Create<EmailJob>() 
       .WithIdentity("job1", "group1") 
       .Build(); 

     // create trigger 
     ITrigger trigger = TriggerBuilder.Create() 
      .WithIdentity("trigger1", "group1") 
      .WithSimpleSchedule(x => 
      { 
       x.WithIntervalInMinutes(intervalBtwnReminders).RepeatForever(); 
      }) 
      .Build(); 

     sched.ScheduleJob(job, trigger); 
    } 

答えて

4

私はこれをより簡単にする方法のセットを書いています。 新しい間隔で既存のトリガーを編集することはできませんが、既存のトリガーを新しい間隔で置き換えることはできます。 CreateTriggerメソッドは、古いトリガーに基づいて新しいトリガーを作成し、TimesTriggeredカウントを転送します。この例では、それを

を使用する方法

/// <summary> 
/// Create a new trigger based on a existing trigger. 
/// </summary> 
/// <param name="oldTrigger">the existing trigger</param> 
/// <param name="startNow">indicates if the trigger should start immediately after schedule</param> 
/// <param name="interval">the interval for the new trigger</param> 
/// <returns>Returns the new trigger</returns> 
public ITrigger CreateTrigger(ITrigger oldTrigger, bool startNow = false, TimeSpan? interval = null) 
{ 
    var builder = oldTrigger.GetTriggerBuilder(); 
    if (startNow) 
     builder = builder.StartNow(); 
    if (interval.HasValue) 
     builder = builder.WithSimpleSchedule(s => s 
      .WithInterval(interval.Value) 
      .RepeatForever()); 

    var newTrigger = builder.Build(); 
    var simpleTrigger = newTrigger as ISimpleTrigger; 
    if(simpleTrigger != null) 
    { 
     var trigger = oldTrigger as ISimpleTrigger; 
     if (trigger != null) 
      simpleTrigger.TimesTriggered = trigger.TimesTriggered; 
    } 

    return newTrigger; 
} 

、スケジューラがすでに実行されています。

// get the trigger 
var trigger = Scheduler.GetTrigger(new TriggerKey("trigger1", "group1")); 

// get your settings and set the interval 
var reminderSettings = GetReminderSettings(); 
var intervalBtwnReminders = 0; 
if (reminderSettings?.RemindersGap != null) 
{ 
    intervalBtwnReminders = (int)(reminderSettings.RemindersGap);   
} 

// reschedule the job with a new trigger and start it immediately. 
// if you don't want that it starts now, pass 'false' for the 'startNow' parameter 
Scheduler.RescheduleJob(trigger.Key, CreateTrigger(trigger, true, TimeSpan.FromMinutes(intervalBtwnReminders))); 
+0

私はそれを得ることはできませんでした、あなたのソリューションをもう少し説明してください。設定のデータベースへの呼び出し先 –

+0

@ Harry.Naeemもう少し説明を加え、パラメータtimespanをintervalに変更してより明確にしました。そして、ドキュメントヘッダを追加しました。私はそれが今より理解できることを願っています。 – Rabban

+0

古いトリガが開始された後(sched.Start())または後(sched.ScheduleJob(job、trigger))、GetTrigger()を使用する必要がありますか? –

関連する問題