2013-05-26 171 views
2

我有一份工作,我想每十分鐘運行一次。要安排它,我使用:作業停止運行?

public static IScheduler _scheduler { get; private set; } 

... 

     ISchedulerFactory schedFact = new StdSchedulerFactory(); 
     _scheduler = schedFact.GetScheduler(); 
     _scheduler.Start(); 

     string cron = "0 0/10 * 1/1 * ? *"; 

     JobKey jobkey = new JobKey("Radar", "F"); 
     IJobDetail job = JobBuilder.Create<RadarJob>() 
            .WithIdentity(jobkey) 
            .Build(); 

     CronScheduleBuilder csb = CronScheduleBuilder.CronSchedule(new CronExpression(cron)).InTimeZone(TimeZoneInfo.Local); 
     ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() 
                  .WithIdentity("Radar-Trigger", "G") 
                  .WithSchedule(csb) 
                  .Build(); 
     try 
     { 
      DateTimeOffset ft = _scheduler.ScheduleJob(job, trigger); 
      Response.Write("Job Scheduled"); 
     } 
     catch (ObjectAlreadyExistsException) 
     { 
      Response.Write("Job Already Exists!"); 
     } 

它似乎起初工作,工作每十分鐘運行良好。但是,一小時左右後,它會停止運行。我記錄成功和錯誤,並且我沒有錯誤。什麼導致我的工作自行停止?

我正在運行IIS 7,.NET Framework 4.0,使用GoDaddy中的共享主機計劃。

+1

也許所有的應用程序都停止了,因爲它會長時間閒置嗎?看看這個問題和答案:http://stackoverflow.com/questions/16749021/iis-turned-off-my-application-automatically – Aristos

+0

請參閱[「應該問題包括」標籤「在他們的標題?」](http:///meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles),其中的共識是「不,他們不應該」! –

回答

3

您的工作在IIS AppPool中運行。該池可能是回收,這將殺死石英任務,並且IIS不會自動重新啓動它(因爲它會重新啓動在池回收時正在處理的Web請求)。

(我假設你正在運行中的Application_Start()上面的代碼你Global.asax文件裏面。)

我們有這種情況,並決定使用石英作爲一個獨立的服務,也不會受到池回收的影響,但我不確定在共享託管計劃下這對您是否可行。

您表示您正在IIS 7上運行。如果實際上這是IIS 7.5,則可能會有更好的解決方案,這些解決方案在Auto-Start application/global.asax/wcf service when IIS7 starts automatically中概述,這將配置應用程序池以自動重新啓動。

+0

謝謝。不幸的是我沒有IIS 7.5。我無法控制共享主機方案上的服務。我可能會最終使用一臺總是在我的網站上加載任務的計算機。或者,也許只是將額外的現金分配給專用服務器。 – msbg

+0

您的主機是否允許您使用Windows計劃任務?如果是這樣,您可以每五分鐘就有一個計劃任務打到網站(IIRC是最短重複時間),以保持活力。 – Thierry