2010-08-22 62 views
2

我试图通过嵌入到.Net MVC2应用程序中来使Quartz.net工作。我知道这并不理想,但我只是试图在将其转移到服务之前将其启动并运行。我无法启动我的工作,但我认为我配置正确。在我的Global.asax.cs:将Quartz.Net嵌入到Asp.NET MVC2中,而不是触发作业

protected void Application_Start() 
{ 
    Quartz.IScheduler scheduler = BuildQuartzScheduler(); 
    ... 
} 

与方法,直接从教程采取:

private IScheduler BuildQuartzScheduler() 
{ 
    // 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(QuartzController)); 
    // fire every hour 
    Trigger trigger = TriggerUtils.MakeMinutelyTrigger(); 
    // start on the next even hour 
    trigger.StartTimeUtc = TriggerUtils.GetEvenMinuteDate(DateTime.UtcNow); 
    trigger.Name = "myTrigger"; 
    sched.ScheduleJob(jobDetail, trigger); 
    return sched; 
} 

与 “控制器:”

public class QuartzController : IJob 
    { 
     public QuartzController() { 
     } 

     public void Execute(JobExecutionContext context) { 
      throw new NotImplementedException(); 
     } 
    } 

没什么东西开枪。这是怎么回事?我确定必须有一个简单的语法错误,但它让我疯狂!

回答

6

如果Application_Start看起来像那样,那么我认为你的scheduler变量很可能在该方法执行完成后立即被垃圾回收。

我会在HttpApplication类中存储对scheduler的引用作为静态变量。通过这种方式,参考在整个过程中持续不断。猜测,但值得一试。

+1

它实际上是需要保存为静态变量的调度程序工厂。 – 2010-08-22 10:02:51

+0

这是那些显而易见的答案之一,我们没有看到它。作为补充,您不需要将作业设置为控制器,甚至可以创建逻辑类,然后调用从IJob接口继承的方法。相当有用的东西 – 2011-07-22 16:25:14

+0

@MarkoLahma - 为什么它不是需要保持静态的调度程序?一旦调度程序由工厂创建,它就是需要依赖的调度程序。后续对Quartz的调用是通过调度器对象完成的,而不是工厂。没有? – Matt 2015-07-02 17:43:25