2013-05-26 115 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