2017-07-14 26 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。雖然我認爲邏輯中存在一個小漏洞(我的答案是這個漏洞),但這個答案不是downvote恕我直言的候選人。 – granadaCoder

0

首先,我不知道爲什麼PinBack答案是downvoted。這不是一個瘋狂的答案。

其次,雖然我認爲PinBack很接近,但我會添加一些我會考慮的評論和代碼。

首先指向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; 
    } 
相關問題