2012-11-20 93 views
2

我試圖讓簡單的預定作業中Quartz.NET 2.0Quartz.NET執行工作只有一次

我讀過有關類似問題,但它並沒有爲我工作了。

問題是作業在StartAt觸發器後僅執行一次。

這裏是我的代碼:

public EntityMappingSvc() 
{ 
    IJobDetail job = JobBuilder.Create<EntityMappingJob>().WithIdentity("QueueJob").Build(); 
    TriggerBuilder tb = TriggerBuilder.Create(); 
    tb.WithIdentity("StdTrigger"); 
    tb.WithSimpleSchedule(a => a.WithIntervalInMinutes(1)); 
    tb.StartAt(new DateTimeOffset(new DateTime(2012, 11, 20, 10, 55, 0))); 
    tb.ForJob(job); 
    ITrigger trigger = tb.Build(); 
    Global.sched.ScheduleJob(job, trigger); 
} 

protected void Application_Start(object sender, EventArgs e) 
{ 
    Global.factory = new StdSchedulerFactory(); 
    Global.sched = Global.factory.GetScheduler(); 
    Global.sched.Start(); 

    GC.KeepAlive(factory); 
    GC.KeepAlive(sched); 
} 

的工作也很簡單......但測試它,我不得不提高該被捕獲並處理分開,並且不影響實際作業的錯誤。

它運行作業後的第一次,它被封鎖在

while (runnable == null && run) 
{ 
    Monitor.Wait(this, 500); 
} 
if (runnable != null) 
{ 
    ran = true; 
    runnable.Run(); 
} 

在SimpleThreadPool Run方法。

有什麼建議嗎?

PS:該應用程序是一個WCF IIS託管服務。

編輯:

TriggerBuilder tb = TriggerBuilder.Create(); 
tb.WithIdentity("StdTrigger"); 
tb.WithCronSchedule("0 1 * * * ?"); 
tb.StartAt(new DateTimeOffset(new DateTime(2012, 11, 20, 10, 45, 0))); 
tb.ForJob(job); 
ICronTrigger trigger = tb.Build() as ICronTrigger; 
Global.sched.ScheduleJob(job, trigger); 

仍然沒有工作。

同樣的問題。

回答

1

我有一個類似的問題。與簡單的靜態指針調度

GC.KeepAlive(factory); 
GC.KeepAlive(sched); 

:更換符號

private static scheduler _scheduler; 
... 
_scheduler.Start(); 
+0

我已經這樣做了,工廠和調度程序在Global.asax中是靜態的,但是是公共的,所以我可以從服務構造函數實例化它們。 – GxG

+0

與我的情況在觸發器類型的唯一區別,嘗試cron之一。 –

+0

仍然沒有,檢查編輯也許我沒有使用Cron權利 – GxG

2

我有同樣的問題,你原來的工作只用簡單的日程安排第一次運行的原因就是你需要指定.RepeatForever()

tb.WithSimpleSchedule(a => a.WithIntervalInMinutes(1).RepeatForever()); 

隨着cronschedule你不需要指定reapeatforever,但我個人更喜歡使用簡單的時間表如有可能,因爲它是很多更具可讀性。