2012-06-14 2 views
2

Просто скачан Quartz.Net, прочитайте документацию, устаревшую и получив код, который, как я считаю, верен. (Дайте мне знать, если это не так)Quartz.Net в приложении ASP.Net

Я положил это в своем приложении Application_Start моего приложения ASP.Net, и код запускается, но задание не выполняется. Кажется, я где-то читал об установке кварца в качестве сингла, но не уверен, что я сделал это здесь?

Я хочу настроить это для ежедневного запуска в 9.00, но на данный момент они используют StartNow для проверки работы.

Просьба сообщить, что я должен сделать?

private void StartScheduler() 
    { 
     ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); 

     IScheduler scheduler = schedulerFactory.GetScheduler(); 
     scheduler.Start(); 

     IJobDetail jobDetail = JobBuilder 
      .Create() 
      .OfType(typeof(DBCleanUpJob)) 
      .WithIdentity(new JobKey("test", "1")) 
      .Build(); 

     var trigger = Quartz.TriggerBuilder.Create() 
        .ForJob(jobDetail) 
        .WithIdentity(new TriggerKey("test", "1")) 
        .WithSimpleSchedule() 
        .StartNow() 
        .Build(); 
     //.WithDailyTimeIntervalSchedule(x=>x.StartingDailyAt(new TimeOfDay(09,00))); 



     scheduler.ScheduleJob(jobDetail, trigger); 
    } 

public class DBCleanUpJob : IJob 
{ 
    private IDocumentSession DocumentSession; 

    public DBCleanUpJob(IDocumentSession DocSession) 
    { 
     DocumentSession = DocSession; 
    } 

    #region IJob Members 

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

    #endregion 
} 
+0

Вы должны принять во внимание, что это будет работать только во время работы вашего приложения на вашем веб-сервере. Как только ваше приложение будет закрыто, триггеры кварца больше не будут выполняться. – Jehof

+0

Все нормально. Задача состоит в том, чтобы очистить старые данные из базы данных, которую использует приложение – Jon

+0

. Тогда почему вы хотите выполнить триггер в 9:00. Если ваше приложение (например, WorkerThread в веб-сервере) не запущено, триггер не будет выполнен. – Jehof

ответ

6

Как вы сказали, планировщик должен быть одноточечным. с кодом о планировщике не является одиночным, и планировщик существует только в области запуска приложения, а не при запуске приложения.

public static IScheduler Scheduler { get; private set; } 

private void StartScheduler() 
{ 
    Scheduler = new StdSchedulerFactory().GetScheduler(); 
    Scheduler.Start(); 

    var jobDetail = JobBuilder 
     .Create() 
     .OfType(typeof(DBCleanUpJob)) 
     .WithIdentity(new JobKey("test", "1")) 
     .Build(); 

    var trigger = Quartz.TriggerBuilder.Create() 
       .ForJob(jobDetail) 
       .WithIdentity(new TriggerKey("test", "1")) 
       .WithSimpleSchedule() 
       .StartNow() 
       .Build(); 
    //.WithDailyTimeIntervalSchedule(x=>x.StartingDailyAt(new TimeOfDay(09,00))); 

    Scheduler.ScheduleJob(jobDetail, trigger); 
} 

и как указал Иегоф. IIS отключит веб-сайт/приложение, если в течение определенного периода времени активности нет.

Также обратите внимание, что ваши рабочие места не будут иметь доступа к конвейеру asp.net. задания не выполняются в контексте запроса, поэтому сеанс, запрос, ответ и файлы cookie недоступны для задания.

Наконец, если вы хотите, чтобы планировщик всегда работал, он должен быть независимым от веб-сайта. Службы Windows - хороший кандидат. создать проект службы Windows и запустить планировщик при запуске службы. вы могли бы настроить кварц на веб-сайт для прокси-заданий для службы Windows. позволяя сайту планировать задания, но фактическое хранение и выполнение выполняется планировщиком служб Windows.

+0

Будет ли application_start происходить только один раз для всего сценария использования? Если 100 пользователей подключаются к веб-сайту, я предполагаю, что запуск приложения происходит только один раз? если IIS выключится через некоторое время, но в тот же день я не хочу, чтобы планировщик запускался, если на борту появился новый пользователь. сервис - лучший способ пойти, но у меня нет такого варианта. – Jon

+0

Также у меня есть точки останова в моем классе работы и использование ваших модов, его все еще не работает ??? – Jon

+1

application_start запускается при запуске веб-сайта. если 5 пользователей получат доступ к вашему сайту, это будет срабатывать один раз, когда первое использование обратится к системе. он не будет срабатывать для следующих 4. однако, если все 5 оставить сайт остановится. на этом этапе, когда следующий пользователь посещает сайт, приложение_запуск начнется снова. подумайте об этом, открыв и закрыв браузер или MS Word. –

Смежные вопросы