2012-02-09 91 views
1

我想讓Quartz.net調度程序工作,但我不知道爲什麼它不在未來的日期安排工作。我已經用cron觸發器進行了測試,該觸發器每分鐘都會觸發並且工作(工作和所有),所以我知道這與我的工作代碼不存在問題。這些變量是垃圾收集?

事情我已經嘗試:

  1. 使得ISchedulerFactory一個全局靜態變量
  2. 使得IScheduler一個全局靜態變量
  3. 我所添加的電子郵件通知的Application_Start結束,所以我知道當它發射時
  4. 每當我對調度程序代碼進行更改時,我都會重新啓動應用程序,並且它會觸發我的通知電子郵件,所以我知道它已重新啓動。

我在一個共享的宿主環境中運行這個程序(不知道這對它有什麼影響)。我的猜測(這只是一個猜測)是垃圾收集,但我不知道是什麼和爲什麼。

void Application_Start(object sender, EventArgs e) 
{ 
    // Code that runs on application startup 
    // construct a scheduler factory 
    ISchedulerFactory schedFact = new StdSchedulerFactory(); 

    // get a scheduler 
    IScheduler sched = schedFact.GetScheduler(); 
    sched.Start(); 

    // construct job info 
    JobDetail jobDetail = new JobDetail("myJob", null, typeof(Recorder)); 
    jobDetail.JobDataMap["domain"] = "www.mydomain.com"; 
    jobDetail.JobDataMap["userId"] = "2"; 

    // Create trigger (everything is in UTC!!!) 
    CronTrigger cronTrigger = new CronTrigger("Schedule"); 
    cronTrigger.StartTimeUtc = TriggerUtils.GetEvenSecondDate(DateTime.UtcNow); 
    cronTrigger.TimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); // run in pacific timezone 
    cronTrigger.CronExpressionString = "0 30 13 ? * MON-FRI *"; 

    sched.ScheduleJob(jobDetail, cronTrigger); 
} 
+0

你可能想讀這個問題,它的答案:http://stackoverflow.com/questions/1356789/quartz-net-with-asp-net – 2012-02-09 17:08:28

回答

2

如果沒有請求進入,ASP.NET進程可以被IIS關閉,所以這些代碼都不會被觸發。

這就是爲什麼網絡應用程序不是像服務一樣(始終運行)行爲的良好來源的原因。

我見過這個在網頁應用中實現的頁面/網頁服務,通過外部的cURL工具獲取。

如果您有興趣進一步調試,請在Application_End中添加一些通知,以確保在計時器觸發預定作業之前實際關閉該進程。

+0

我越讀越多,我認爲這是什麼發生。如果應用程序進程關閉,新的請求將觸發application_start方法? – chobo 2012-02-10 17:43:26

+0

是 - 如果IIS由於不活動而決定關閉應用程序池,則新請求將再次啓動應用程序以完成請求。在IIS的AppPool設置中查看「Idle-Timeout」(默認爲20分鐘)。如果20分鐘內沒有請求,應用程序池可能會被IIS關閉。您可以根據需要延長這段時間。 – Leon 2012-02-10 18:10:57

+0

另一種選擇是,如果你沒有IIS的控制權(共享主機),就是每隔一段時間通過'curl'發送一個請求到一個「啞」頁面,以防止應用程序閒置。 – Leon 2012-02-10 18:22:53