2012-02-09 3 views
1

나는 Quartz.net 스케줄러를 작동 시키려고 노력하고있다. 그러나 나는 미래에 예정된 작업을 위해 발사되지 않는 이유를 모른다. 나는 매분마다 작동하는 cron 트리거로 테스트를했는데 작동합니다 (모든 작업). 그래서 제 직업 코드에 문제가 없다는 것을 압니다.이러한 변수가 가비지 수집됩니까?

것들 내가 시도하십시오 ISchedulerFactory A는 글로벌 정적 변수 나는 그래서 위해 Application_Start의 마지막에 이메일 알림을 추가 한

  • 내가 알고있는 IScheduler을 만드는 글로벌 정적 변수
  • 만들기

    1. 실행 중일 때
    2. 스케줄러 코드를 변경할 때마다 앱을 다시 시작하면 알림 이메일이 전송되므로 다시 시작되었음을 알 수 있습니다.

    나는이 프로그램을 공유 호스팅 환경에서 실행하고 있습니다 (어떤 영향을 미칠지 확실하지 않음). 내 추측 (그리고 이것은 단지 추측이다) 뭔가 쓰레기 수거되고 있지만, 나는 무엇과 왜 모르겠다.

    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 –

    답변

    2

    요청이 없을 경우 IIS가 ASP.NET 프로세스를 종료 할 수 있으므로이 코드는 실행되지 않습니다.

    이것은 웹 응용 프로그램이 (항상 실행중인) 서비스 동작과 같은 좋은 소스가 아닌 이유입니다.

    외부에서 cURL 도구를 통해 핑 (ping)되는 페이지/웹 서비스가있는 웹 응용 프로그램에서 구현 된 것을 보았습니다.

    더 자세히 디버깅하고 싶다면 Application_End에 알림을 추가하여 타이머가 예약 된 작업을 시작하기 전에 프로세스가 실제로 종료되었는지 확인하십시오.

    +0

    더 읽을수록 그게 더 있다고 생각합니다. 사고. 응용 프로그램 프로세스가 종료되면 새 요청이 application_start 메서드를 트리거합니까? – chobo

    +0

    예 - IIS가 비활성으로 인해 응용 프로그램 풀을 종료하기로 결정한 경우 새 요청은 요청을 이행하기 위해 응용 프로그램을 다시 시작합니다. IIS의 AppPool 설정에서 Idle-Timeout (기본값은 20 분)을 찾습니다. 20 분 동안 요청하지 않으면 IIS가 응용 프로그램 풀을 종료 할 수 있습니다. 필요한만큼이 시간을 연장 할 수 있습니다. – Leon

    +0

    또 다른 옵션은 IIS (공유 호스팅)에 대한 통제가없는 경우 무언가를 응용 프로그램을 유휴 상태로 유지하기 위해 "curl"을 통해 "벙어리"페이지에 요청하는 것입니다. – Leon

    관련 문제