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);
});
}
}
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
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
Agh. Nienawidzę, jak nie możesz mieć nowych linii w komentarzach! – NickG