2014-10-27 47 views
1

我已經定義了以下觸發工作)在StartAt(提及的日期的第一把火時間:設置觸發

var postbagJobTrigger = (ICronTrigger)TriggerBuilder.Create() 
     .WithIdentity("cronJOBBER", "Campaigns") 
     .WithCronSchedule("0 13 9 1/5 * ? *") 
     .StartAt(new DateTime(2014, 12, 3)) 
     .EndAt(new DateTime(2015, 3, 3)) 
     .WithPriority(1) 
     .Build(); 

我想到的是,我的觸發器的第一次應該是DateTime(2014, 12, 3) 。但是當我看到這份工作的發射時間表時,第一次是DateTime(2014, 12, 6)。當我添加StartNow()條件時,第一次將是現在開始計劃的時間,即DateTime(2014, 10, 31)。我如何告訴觸發器在我的StartAt()時間首次運行?

回答

2

對我來說似乎沒問題。
問題出在您的CRON表達式中。這是12月的結果:

8 Monday, December 1, 2014 9:13 AM 
9 Saturday, December 6, 2014 9:13 AM 
10 Thursday, December 11, 2014 9:13 AM 
11 Tuesday, December 16, 2014 9:13 AM 
12 Sunday, December 21, 2014 9:13 AM 
13 Friday, December 26, 2014 9:13 AM 
14 Wednesday, December 31, 2014 9:13 AM 

您指示Quartz.Net從12月3日開始計數。

你可以用CronMaker檢查你的表情。

最好不要使用DateTime。這是StartAt定義:

// 
// Summary: 
//  Set the time the Trigger should start at - the trigger may or may not fire 
//  at this time - depending upon the schedule configured for the Trigger. However 
//  the Trigger will NOT fire before this time, regardless of the Trigger's schedule. 
// 
// Parameters: 
// startTimeUtc: 
//  the start time for the Trigger. 
// 
// Returns: 
//  the updated TriggerBuilder 
public TriggerBuilder StartAt(DateTimeOffset startTimeUtc); 

你應該使用DateTimeOffset。這article可能會幫助你。

UPDATE:

Quartz.Net使用本地TimeZone除非您指定一個不同的。

如果要檢查什麼時區的觸發器使用:

((CronTriggerImpl)trigger).TimeZone 

一個更好的辦法是使用DateBuilder

DateTimeOffset dtNow = DateBuilder.DateOf(10, 32, 30, 28, 10, 2014); 

uses當地時區。

如果你想達到你的要求,你可以做這樣的事情是什麼:

ITrigger trigger = TriggerBuilder 
    .Create() 
    .WithIdentity("trigger1", "myGroup") 
    .StartAt(DateBuilder.DateOf(0, 0, 0, 3, 12, 2014)) 
    .EndAt(DateBuilder.DateOf(0, 0, 0, 3, 3, 2015)) 
    //.WithCronSchedule("0 0 0 1/5 * ? *") 
    .WithCalendarIntervalSchedule(f=>f.WithIntervalInDays(5)) 
    .WithPriority(1) 
    .Build(); 

ITrigger trigger = TriggerBuilder 
    .Create() 
    .WithIdentity("trigger1", "myGroup") 
    .StartAt(DateBuilder.DateOf(0, 0, 0, 3, 12, 2014)) 
    .EndAt(DateBuilder.DateOf(0, 0, 0, 3, 3, 2015)) 
    // .WithCronSchedule("0 0 12 1/5 * ? *") 
    .WithSimpleSchedule(f=>f.WithIntervalInHours(24 * 5).RepeatForever()) 
    .WithPriority(1) 
    .Build(); 

如果要檢查你的時間表致電GetNextXFireTimes。這是函數:

private void GetNextXFireTimes(ITrigger trigger, int counts) 
{ 
    var dt = trigger.GetNextFireTimeUtc(); 
    for (int i = 0; i < (counts-1); i++) 
    { 
     if (dt == null) 
     { 
      break; 
     } 
    Console.WriteLine(dt.Value.ToLocalTime()); 
    dt = trigger.GetFireTimeAfter(dt); 
    } 
} 

這是正路的Cron表達式工作:

* * * * * 
- - - - - 
| | | | | 
| | | | +----- day of week (0 - 6) (Sunday=0) 
| | | +------- month (1 - 12) 
| | +--------- day of month (1 - 31) 
| +----------- hour (0 - 23) 
+------------- min (0 - 59) 
+0

我將檢查程序。謝謝!我還有一個關於Utc的問題。那裏的交易是什麼?我的工作是否會根據他們的'Utc'觸發?時間。我需要額外做些什麼才能在當地時間工作? (我通過+1的方式住在瑞典)。 – Disasterkid 2014-10-28 09:35:57

+1

cronmaker的+1 – 2014-10-28 10:33:15

+1

@CircularReference:謝謝。 – LeftyX 2014-10-28 10:35:03