2012-02-09 88 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