2013-12-02 3 views
0

Это мое требование.Планирование работы с использованием кварца - Нужна оценка

Главная Работа: Job1 (по расписанию запускать каждые 5 минут) Дочернее Работа: Job2, Job3, Job4, Job5 и т.д. (все вспомогательные работы будут иметь те же определения, но только JobData будет отличаться)

В течение каждое выполнение «Job1» одного вспомогательного задания будет запланировано только один раз. Пример: первого выполнение Job1: Работа «Job2» будет назначена 2 минуты от DateTime.Now второй Казни Job2: Работа «Job3» будет назначена 2 минуты от DateTime.Now ...

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

Я использую службу Windows для запуска и остановки всего процесса. Вот код службы Windows.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Configuration; 

namespace TestScheduling 
{ 
    class TestMainClass : ServiceBase 
    { 
     TestJobScheduler scheduler = new TestJobScheduler(); 

     public TestMainClass() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnStart(string[] args) 
     { 
      try 
      { 
      scheduler.StartScheduler(); 
       scheduler.ScheduleMainJob(); 
      } 
      catch (Exception e) 
      { 
       //Capture Exception 
      } 
     } 

     protected override void OnStop() 
    { 
     scheduler.StopScheduler(); 
    } 
    } 
} 

Вот код для класса TestJobScheduler.

using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 
using System.Data.Odbc; 
using Quartz; 
using Quartz.Impl; 

namespace TestScheduling 
{ 
    class TestJobScheduler : ITaskScheduler 
    { 
     IScheduler sched; 

     public void ScheduleMainJob() 
     { 
      .... 
      sched = getScheduler(); 
      sched.ScheduleJob(job1,trig); 
      .... 
      ScheduleSubsidiaryJob("job2") 
     } 

     public void ScheduleSubsidiaryJob(String jobname) 
     { 
      ... 
      /*Create New Trigger and Associate Subsidiary Job with new JobData*/ 
      sched = getScheduler(); 
      sched.ScheduleJob(trig); 
     } 

     public IScheduler getScheduler() 
     { 
      ISchedulerFactory sf = new StdSchedulerFactory(); 
      return sf.GetScheduler(); 
     } 

     public void StartScheduler(IJobDetail job, ISimpleTrigger trigger) 
     { 
      sched = getScheduler(); 
      sched.Start(); 
     } 

     public void StopScheduler() 
     { 
      if (sched != null) 
      { 
       sched.Shutdown(); 
      } 
     } 
    } 
} 

Еще один момент заключается в том, что я использую AdoJobStore с OracleDelegate.

Может ли кто-нибудь сказать мне, правильно ли я делаю это?

ответ

0

Вы можете взглянуть на образец Quartz.Server, который поставляется с дистрибутивом zip Quartz.NET. Также доступны прямо на GitHub:

https://github.com/quartznet/quartznet/tree/master/server/Quartz.Server

Вы должны одни и те же планировщик. Только создайте фабрику планировщика один раз и получите планировщик Singleton оттуда.

Возможно, ваша работа добавлена ​​только один раз для планировщика как долговечная и параметризует его с помощью карты данных задания триггера. Затем вы можете получить доступ к комбинированному заданию и инициировать данные из MergedJobDataMap, который поставляется с контекстом выполнения задания.

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

Обратите внимание: DateTime.Now может быть не таким, каким вы хотите. Для Quartz.NET теперь есть DateTime.UtcNow (или даже лучше DateTimeOffset.UtcNow).

+0

Привет, Марко, .. Спасибо за входы .. Я только что добавил Quartz.dll к моим проектам и его работе. Я НЕ развернул службу Windows Quartz Server. Я назначил задания с помощью триггеров и его работоспособность. Я хочу знать, что «кто» контролирует триггеры и выполняет работу? – wesfaith

+0

Это сочетание разных актеров. Но основной цикл можно найти в QuartzSchedulerThread, который запрашивает триггеры из хранилища заданий, а затем выполняет их внутри оболочки запуска задания. –

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