2011-05-02 55 views
1

使用Quartz.Net和需要相同的觸發器有多個日曆,雖然這是不可能的我正在尋找如何實現類似功能的建議。Quartz.Net多個日曆

例如,我想在X分鐘內運行該作業,並且每天排除9-10am,但可以根據需要在白天屏蔽其他時間。

下面的代碼工作正常,但如果我想阻止另一個時間間隔,我看不到一種方法。

ISchedulerFactory schedFact = new StdSchedulerFactory(); 
sched = schedFact.GetScheduler(); 

CronCalendar cronCal = new CronCalendar("* * 9 ? * * *"); 
sched.AddCalendar("testCal", cronCal, true, true); 

CronTrigger trigger = new CronTrigger("cronTrigger", null, "0 0/1 * 1/1 * ? *");    
trigger.StartTimeUtc = DateTime.UtcNow.AddMinutes(10); 
trigger.CalendarName = "testCal"; 

JobDetail job = new JobDetail("testJob", null, typeof(DumbJob)); 

sched.ScheduleJob(job, trigger); 
sched.start(); 

簡單測試工作:

public class DumbJob : IJob 
     { 
      public DumbJob() 
      { 
      } 

      public void Execute(JobExecutionContext context) 
      { 
       MessageBox.Show("Dumb job is running"); 
      } 
     } 

回答

3

您可以創建日曆鏈。每個日曆都可以有一個基準日歷,在確定是否排除或包含給定時間時也會對其進行檢查。見CronCalendar的構造器:

public CronCalendar(ICalendar baseCalendar, string expression) 
+0

在API文檔中已經閱讀了這個,但它沒有發生,我可以這樣使用它。感謝您的提示......以及當然優秀的軟件;) – ServerMonkey 2011-05-18 04:06:20

0

我設法找到實現多日曆,發現鏈接中的解決方案:Quartz.Net multple calendars 馬爾科Lahma給予解決創建日曆鏈BaseCaleandar。

我測試並發現日曆鏈中存在一些錯誤。

我只是改變Quartz.Examples.2010.Example8中的一些代碼。

一個WeeklyCalendar添加到AnnualCalendar:

WeeklyCalendar weeklyCalendar = new WeeklyCalendar(); 

weeklyCalendar.SetDayExcluded(DayOfWeek.Sunday, true); 
weeklyCalendar.SetDayExcluded(DayOfWeek.Saturday, true); 

// Add the holiday calendar to the schedule 
AnnualCalendar holidays = new AnnualCalendar(weeklyCalendar); 

添加兩個假期到AnuualCalendar爲接下來的兩天裏:

DateTime day1= new DateTime(DateTime.UtcNow.Year, 1, 22); 
holidays.SetDayExcluded(day1, true); 
DateTime day2= new DateTime(DateTime.UtcNow.Year, 1, 23); 
holidays.SetDayExcluded(day2, true); 

附上AnnualCalendar到SimpleTrigger與IntervalInHourse 72小時/ 96小時/ 120H和在1/21火。

  1. 正確的結果是1/25爲72h,但返回1/24。
  2. 正確的結果是1/26爲96h,但返回1/24。
  3. 120的正確結果是1/31,是的,它返回1/31。