2017-07-14 27 views
1

Windowsサービス内でQuartz.netを使用して、自分のデータベース内に存在するジョブをスケジュールしています。Quartz.Netのすべてのジョブとスケジュールを定期的に再ロードするにはどうしたらいいですか?

私のユーザーは、CRON式を変更できるこの表のフロントエンドを持っています。現在のところ、私のアプリケーションにはCRON式を変更するロジックやサービスの再起動なしにジョブを追加/削除するロジックがありません(ジョブのリロードがトリガーされるため)。 以下のコードを使用して、データベースからすべてのジョブをロードしています。

protected void LoadJobs() 
{ 
    logger.Info("Loading jobs."); 
    var jobs = middlewareRepository.GeActiveJobs(); 

    foreach (var job in jobs) 
    { 
     IJobDetail jobDetail = JobBuilder.Create<JobDespatcher>() 
      .WithIdentity(job.Description) 
      .UsingJobData("JobId", job.Id) 
      .Build(); 

     ITrigger trigger = TriggerBuilder.Create() 
      .WithCronSchedule(job.CronExpression) 
      .Build(); 

     scheduler.ScheduleJob(jobDetail, trigger); 
     logger.InfoFormat("Job with id {0} ({1}) has been scheduled.", job.Id, job.Description); 
    } 
} 

スケジューラキューをクリアしてジョブをリロードする方法はありますか。 Quartz.Netにはこれを行うための関数が組み込まれていますか? または、すべてのジョブ/スケジュールをアンロードして再ロードするロジックを構築する必要がありますか? 現在実行中のジョブを削除すると、そのジョブは停止するのか、続行されますか?

これを実装する最良の方法についてのアドバイスは素晴らしいことです。

+0

クォーツには、ジョブとトリガを変更して再スケジュールするのに十分な方法があります。これを使用して、スケジューラを再起動します。ジョブ/トリガー情報を別のテーブルに保持する必要もありません。 Quartzはデータベースと対話して、すべてのジョブの状態を保存できます。 – Rabban

答えて

1

スケジューラをシャットダウンしてもう一度やり直すことができると思います。

scheduler.Shutdown(); 
//Recreate the scheduler 
//Recreate jobs 
scheduler.Start(); 
+0

これは実行中のジョブを強制終了すると仮定していますか? – Lock

+0

'void Shutdown(bool waitForJobsToComplete)'を使うこともできます。説明 'waitForJobsToComplete: trueの場合、スケジューラは、現在実行中のすべてのジョブが完了するまでこのメソッドを返すことを許可しません。 ' – PinBack

+0

ここでは、downvoteについてはわかりません。私はロジック(私の答えはアドレス)に1つの小さな穴があると思うが、この答えはdownvote IMHOの候補ではありません。 – granadaCoder

0

まず、PinBackの回答がダウンした理由はわかりません。それはマーククレイジーの答えではない。

第2に、私はピンバックが近いと思っていますが、私はいくつかのコメントとコードを追加します。

最初にAPIへのリンク。

http://quartznet.sourceforge.net/apidoc/2.0/html/

ない「.Refresh」方法がないので.....あなたは、スケジューラがすでに存在する場合、それが正常にシャットダウンします.....以下のコードを検討するかもしれません。それは "リフレッシュ"(別名、GetSchedulerへの新しい呼び出し)を強制し、開始し、新しく更新されたスケジューラを返します。

private IScheduler InitializeOrRefreshScheduler(IScheduler existingScheduler) 
    { 
     IScheduler returnSchedule = null; 

     if (null != existingScheduler) 
     { 
      existingScheduler.Shutdown(true); /* gracefully shut down the scheduler http://quartznet.sourceforge.net/apidoc/2.0/html/html/31359f2c-7a57-50e8-5e8b-102ceb3991c9.htm */ 
     } 
     else 
     { 
      /* the existingScheduler is null, so it would be null on "first startup" */ 
     } 

     var config = (NameValueCollection)ConfigurationManager.GetSection("quartz"); 

     ISchedulerFactory factory = new StdSchedulerFactory(config); 
     returnSchedule = factory.GetScheduler();  
     returnSchedule.Start();    

     return returnSchedule; 
    } 
関連する問題