2009-08-31 2 views
71

Я не знаю, как использовать Quartz.dll в ASP.NET. Где написать код для планирования заданий для запуска почты каждое утро? Пожалуйста, если какое-то тело знает об этом, PLZ помогите мне ...Как использовать Quartz.net с ASP.NET

Редактировать: Я нашел HOW TO use Quartz.NET in PRO way?, чтобы быть действительно полезным.

ответ

74

У вас есть несколько вариантов, в зависимости от того, что вы хотите сделать и как вы хотите настроить его. Например, вы можете установить сервер Quartz.Net в качестве автономной службы Windows, и вы также можете встроить ее в свое приложение asp.net.

Если вы хотите, чтобы запустить его встроенный, то вы можете запустить сервер из произнесите global.asax, как это (из примеров исходного кода, например, # 12):

NameValueCollection properties = new NameValueCollection(); 
properties["quartz.scheduler.instanceName"] = "RemoteServer"; 

// set thread pool info 
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz"; 
properties["quartz.threadPool.threadCount"] = "5"; 
properties["quartz.threadPool.threadPriority"] = "Normal"; 

ISchedulerFactory sf = new StdSchedulerFactory(properties); 
IScheduler sched = sf.GetScheduler(); 
sched.Start(); 

Если вы запускаете его как сервис, вы бы удаленно подключиться к нему, как это (из примера # 12):

NameValueCollection properties = new NameValueCollection(); 
properties["quartz.scheduler.instanceName"] = "RemoteClient"; 

// set thread pool info 
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz"; 
properties["quartz.threadPool.threadCount"] = "5"; 
properties["quartz.threadPool.threadPriority"] = "Normal"; 

// set remoting expoter 
properties["quartz.scheduler.proxy"] = "true"; 
properties["quartz.scheduler.proxy.address"] = "tcp://localhost:555/QuartzScheduler"; 
// First we must get a reference to a scheduler 
ISchedulerFactory sf = new StdSchedulerFactory(properties); 
IScheduler sched = sf.GetScheduler(); 

После того, как у вас есть ссылка на планировщик (будь то с помощью удаленного доступа или потому, что у вас есть встроенный экземпляр) можно запланировать таких как:

// define the job and ask it to run 
JobDetail job = new JobDetail("remotelyAddedJob", "default", typeof(SimpleJob)); 
JobDataMap map = new JobDataMap(); 
map.Put("msg", "Your remotely added job has executed!"); 
job.JobDataMap = map; 
CronTrigger trigger = new CronTrigger("remotelyAddedTrigger", "default", "remotelyAddedJob", "default", DateTime.UtcNow, null, "/5 * * ? * *"); 
// schedule the job 
sched.ScheduleJob(job, trigger); 

Вот ссылка на некоторые должности, которые я написал для людей, как начать работу с Quartz.Net: http://jvilalta.blogspot.com/2009/03/getting-started-with-quartznet-part-1.html

+1

Не могли бы вы обновить сообщения и т. Д., Которые используют последнюю версию? Похоже, что формат для значений конфигурации сейчас отличается. Благодаря! – Snowy

+0

Я думаю, что новый способ для 2.x является: # экспорта этого сервера ремоутинга контекста quartz.scheduler.exporter.type = Quartz.Simpl.RemotingSchedulerExporter, кварцевых quartz.scheduler.exporter.port = 555 кварца. scheduler.exporter.bindName = QuartzScheduler quartz.scheduler.exporter.channelType = tcp quartz.scheduler.exporter.channelName = httpQuartz – NickG

+0

Agh. Ненавижу, как у вас не может быть новых строк в комментариях! – NickG

2

Несколько недель назад я писал об использовании Quartz.Net для планирования заданий в Windows Azure Worker ролей. С тех пор я столкнулся с требованием, которое побудило меня создать обертку вокруг Quartz.Net IScheduler. JobSchedule несет ответственность за чтение строки расписания из CloudConfigurationManager и планирование задания.

CloudConfigurationManager считывает настройки из конфигурационного файла Role, который можно редактировать с помощью Windows Azure Management Portal в разделе конфигурации ваших облачных сервисов.

В следующем примере запланировано выполнение задания, которое должно выполняться каждый день в 6:00, 8:00, 10:00, 12:30 и в 16:30. Расписание определяется в настройках роли, которые можно редактировать с помощью Visual Studio. Чтобы получить настройки роли, перейдите в проект Windows Azure Cloud Service и найдите нужные конфигурации ролей в папке Role. Откройте редактор конфигурации, дважды щелкнув файл конфигурации, затем перейдите на вкладку «Настройки». Нажмите «Добавить настройку» и назовите новую настройку «JobDailySchedule» и установите ее значение 6: 0; 8: 0; 10: 0; 12: 30; 16: 30;

The code from this Post is part of the Brisebois.WindowsAzure NuGet Package 

To install Brisebois.WindowsAzure, run the following command in the Package Manager Console 

PM> Install-Package Brisebois.WindowsAzure 

Get more details about the Nuget Package. 

Затем, используя расписание JobSchedule, выполняйте ежедневную работу, используя расписание, определенное в файле конфигурации Role.

var schedule = new JobSchedule(); 

schedule.ScheduleDailyJob("JobDailySchedule", 
          typeof(DailyJob)); 

Реализация DailyJob заключается в следующем. Поскольку это демонстрация, я не буду добавлять какую-либо конкретную логику к заданию.

public class DailyJob : IJob 
{ 
    public void Execute(IJobExecutionContext context) 
    { 
     //Do your daily work here 
    } 
} 

JobSchedule обертывает Quartz.Net IScheduler. В предыдущем посте я говорил о важности упаковки ваших сторонних инструментов, это отличный пример, потому что я содержал логику планирования заданий, и я могу потенциально изменить эту логику, не затрагивая код, который использует JobSchedule.

JobSchedule должен быть настроен при запуске роли и экземпляре JobSchedule в течение всей жизни Роли. Изменение расписания может быть достигнуто путем изменения настройки «JobDailySchedule» через портал управления Azaz Management в разделе конфигурации ваших облачных сервисов. Затем, чтобы применить новое расписание, перезапустите экземпляр роли через портал управления Windows Azure в разделе экземпляров ваших облачных сервисов.

public class JobSchedule 
{ 
    private readonly IScheduler sched; 

    public JobSchedule() 
    { 
     var schedFact = new StdSchedulerFactory(); 

     sched = schedFact.GetScheduler(); 
     sched.Start(); 
    } 

    /// <summary> 
    /// Will schedule jobs in Eastern Standard Time 
    /// </summary> 
    /// <param name="scheduleConfig">Setting Key from your CloudConfigurations, 
    ///        value format "hh:mm;hh:mm;"</param> 
    /// <param name="jobType">must inherit from IJob</param> 
    public void ScheduleDailyJob(string scheduleConfig, 
           Type jobType) 
    { 
     ScheduleDailyJob(scheduleConfig, 
         jobType, 
         "Eastern Standard Time"); 
    } 

    /// <param name="scheduleConfig">Setting Key from your CloudConfigurations, 
    ///        value format "hh:mm;hh:mm;"</param> 
    /// <param name="jobType">must inherit from IJob</param> 
    public void ScheduleDailyJob(string scheduleConfig, 
           Type jobType, 
           string timeZoneId) 
    { 
     var schedule = CloudConfigurationManager.GetSetting(scheduleConfig); 
     if (schedule == "-") 
      return; 

     schedule.Split(';') 
       .Where(s => !string.IsNullOrWhiteSpace(s)) 
       .ToList() 
       .ForEach(h => 
     { 
      var index = h.IndexOf(':'); 
      var hour = h.Substring(0, index); 
      var minutes = h.Substring(index + 1, h.Length - (index + 1)); 

      var job = new JobDetailImpl(jobType.Name + hour + minutes, null, 
             jobType); 

      var dh = Convert.ToInt32(hour, CultureInfo.InvariantCulture); 
      var dhm = Convert.ToInt32(minutes, CultureInfo.InvariantCulture); 
      var tz = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); 

      var cronScheduleBuilder = CronScheduleBuilder 
              .DailyAtHourAndMinute(dh, dhm) 
              .InTimeZone(tz); 
      var trigger = TriggerBuilder.Create() 
             .StartNow() 
             .WithSchedule(cronScheduleBuilder) 
             .Build(); 

      sched.ScheduleJob(job, trigger); 
     }); 
    } 

    /// <summary> 
    /// Will schedule jobs in Eastern Standard Time 
    /// </summary> 
    /// <param name="scheduleConfig">Setting Key from your CloudConfigurations, 
    ///        value format "hh:mm;hh:mm;"</param> 
    /// <param name="jobType">must inherit from IJob</param> 
    public void ScheduleWeeklyJob(string scheduleConfig, 
            Type jobType) 
    { 
     ScheduleWeeklyJob(scheduleConfig, 
          jobType, 
          "Eastern Standard Time"); 
    } 


    /// <param name="scheduleConfig">Setting Key from your CloudConfigurations, 
    ///        value format "hh:mm;hh:mm;"</param> 
    /// <param name="jobType">must inherit from IJob</param> 
    public void ScheduleWeeklyJob(string scheduleConfig, 
            Type jobType, 
            string timeZoneId) 
    { 
     var schedule = CloudConfigurationManager.GetSetting(scheduleConfig); 

     schedule.Split(';') 
       .Where(s => !string.IsNullOrWhiteSpace(s)) 
       .ToList() 
       .ForEach(h => 
     { 
      var index = h.IndexOf(':'); 
      var hour = h.Substring(0, index); 
      var minutes = h.Substring(index + 1, h.Length - (index + 1)); 

      var job = new JobDetailImpl(jobType.Name + hour + minutes, null, 
             jobType); 

      var dh = Convert.ToInt32(hour, CultureInfo.InvariantCulture); 
      var dhm = Convert.ToInt32(minutes, CultureInfo.InvariantCulture); 
      var tz = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); 
      var builder = CronScheduleBuilder 
          .WeeklyOnDayAndHourAndMinute(DayOfWeek.Monday, 
                 dh, 
                 dhm) 
          .InTimeZone(tz); 

      var trigger = TriggerBuilder.Create() 
             .StartNow() 
             .WithSchedule(builder) 
             .Build(); 

      sched.ScheduleJob(job, trigger); 
     }); 
    } 
}