2010-08-22 3 views
2

내 .Net MVC2 응용 프로그램에 임베드하여 Quartz.net을 작동 시키려고합니다. 나는 이것이 이상적이지 않다는 것을 안다. 그러나 나는 그것을 서비스로 옮기기 전에 실행하고 실행하려고 노력하고있다. 내 일자리를 해고 할 수는 없지만 제대로 구성되었다고 생각합니다.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; 
} 

그리고 "컨트롤러"내 Global.asax.cs에서

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

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

아무것도 이제까지 해고됩니다. 무슨 일이야? 나는 간단한 문법 실수가 틀림 없다고 확신하지만 그것은 나를 미치게 만든다!

답변

6

Application_Start처럼 보이는 경우 해당 메서드가 실행을 마자 바로 scheduler 변수가 가비지 수집 될 가능성이 있습니다.

HttpApplication 클래스에 정적 변수로 scheduler에 대한 참조를 저장하고 싶습니다. 이렇게하면 참조가 프로세스 기간 동안 중단됩니다. 짐작 하겠지만, 가치있는 장면.

+1

실제로 정적 변수로 유지해야하는 스케줄러 팩토리입니다. –

+0

이것은 우리가 볼 수없는 명백한 해답 중 하나입니다. 또한 컨트롤러에 작업을 설정할 필요가 없기 때문에 로직 클래스를 생성 한 다음 IJob 인터페이스를 상속하는 메소드를 호출 할 수도 있습니다. 꽤 유용한 것들 –

+0

@MarkoLahma - 왜 정적으로 유지해야하는 스케줄러가 아닐까요? 일단 공장에서 스케쥴러를 생성하면 스케쥴러가 살아 있어야합니다. Quartz에 대한 후속 호출은 공장이 아닌 스케줄러 객체를 통해 이루어진다. 아니? – Matt

관련 문제