2009-08-31 11 views

Odpowiedz

74

Masz kilka opcji, w zależności od tego, co chcesz zrobić i jak chcesz je skonfigurować. Na przykład możesz zainstalować serwer Quartz.Net jako samodzielny program do obsługi systemu Windows, który możesz również osadzić w swojej aplikacji asp.net.

Jeśli chcesz uruchomić to wbudowany, można uruchomić serwer z wypowiedzenie Global.asax tak (z przykładami kodu źródłowego Przykład # 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(); 

Jeśli go uruchomić jako usługa, należy połączyć się zdalnie z tym tak (z przykładu # 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(); 

gdy masz odniesienie do terminarza (czy to za pośrednictwem usług zdalnych lub ponieważ masz wbudowany instancji) można zaplanować zadania takie jak to:

// 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); 

Oto link do niektórych postach pisałem ludziom rozpoczęcie pracy z Quartz.Net: http://jvilalta.blogspot.com/2009/03/getting-started-with-quartznet-part-1.html

+1

Czy możesz zaktualizować posty, itp., Które używa najnowszej wersji? Wygląda na to, że format wartości konfiguracyjnych jest teraz inny. Dzięki! – Snowy

+0

myślę nowszy sposób 2.x jest: # eksport tego serwera do usług zdalnych kontekst quartz.scheduler.exporter.type = Quartz.Simpl.RemotingSchedulerExporter, kwarc quartz.scheduler.exporter.port = 555 kwarcu. scheduler.exporter.bindName = QuartzScheduler quartz.scheduler.exporter.channelType = tcp quartz.scheduler.exporter.channelName = httpQuartz – NickG

+0

Agh. Nienawidzę, jak nie możesz mieć nowych linii w komentarzach! – NickG

2

Kilka tygodni temu pisałem o użyciu Quartz.Net zaplanować pracę w rolach Azure Pracownik systemu Windows. Od tego czasu natrafiłem na wymaganie, które popchnęło mnie do stworzenia opakowania wokół Igłotnika Quartz.Net. JobSchedule jest odpowiedzialny za odczytywanie łańcucha harmonogramu z CloudConfigurationManager i planowanie pracy.

Menedżer CloudConfigurationManager odczytuje ustawienia z pliku konfiguracyjnego roli, który można edytować za pomocą portalu zarządzania Windows Azure w sekcji konfiguracji usług chmurowych.

W poniższym przykładzie zaplanowano zadanie, które musi być wykonywane codziennie o 6 rano, 8 rano, 10 rano, 12:30 i o 16:30. Harmonogram jest zdefiniowany w ustawieniach roli, które można edytować w Visual Studio. Aby uzyskać ustawienia roli, przejdź do projektu usługi Cloud Service w usłudze Windows Azure i znajdź żądane konfiguracje ról w folderze Role. Otwórz edytor konfiguracji, klikając dwukrotnie plik konfiguracyjny, a następnie przejdź do karty "Ustawienia". Kliknij "Dodaj ustawienie" i nadaj nowe ustawienie "JobDailySchedule" i ustaw jego wartość na 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. 

Następnie za pomocą harmonogramu JobSchedule codzienne zlecenie z harmonogramem zdefiniowanym w pliku konfiguracyjnym Role.

var schedule = new JobSchedule(); 

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

Implementacja DailyJob przebiega następująco. Ponieważ jest to wersja demonstracyjna, nie dodam żadnej konkretnej logiki do zadania.

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

Harmonogram pracy otacza program sprzęgający Quartz.Net. W poprzednim wpisie mówiłem o znaczeniu owijania narzędzi innych firm, jest to doskonały przykład, ponieważ mam logikę planowania zadań i mogę potencjalnie zmienić tę logikę bez wpływania na kod korzystający z JobSchedule.

Harmonogram JobSchedule powinien zostać skonfigurowany po uruchomieniu Roli i utrzymaniu instancji JobSchedule przez cały okres istnienia Roli. Zmiana harmonogramu może zostać osiągnięta poprzez zmianę ustawienia "JobDailySchedule" za pośrednictwem portalu zarządzania Windows Azure w sekcji konfiguracji usług chmurowych. Następnie, aby zastosować nowy harmonogram, zrestartuj instancję roli za pośrednictwem portalu zarządzania Windows Azure w sekcji instancji usług chmurowych.

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); 
     }); 
    } 
} 
Powiązane problemy