Il y A quelques semaines, j'ai écrit à propos de l'utilisation Quartz.Net planifier des tâches dans Windows Azure Rôles de travail. Depuis lors, j'ai couru dans une exigence qui m'a poussé à créer un wrapper autour de la Quartz.Net IScheduler. Le JobSchedule a la responsabilité de la lecture d'une planification de la chaîne à partir de la CloudConfigurationManager et le calendrier de travail.
Le CloudConfigurationManager lit les paramètres du Rôle du fichier de configuration, qui peut être modifié via le Portail de Gestion Windows Azure en vertu de la section configurer de vos services cloud.
L'exemple suivant permet de planifier une tâche qui doit être exécutée tous les jours à 6 h, 8 h, 10 h, à 12 H 30 et 4:30 PM. Le planning est défini dans le Rôle de paramètres qui peuvent être modifiés par le biais de Visual Studio. Pour atteindre les paramètres de Rôle, allez à votre Service en Nuage Windows Azure projet et de trouver le Rôle souhaité configurations sous le Rôle dossier. Ouvrir l'éditeur de configuration en double-cliquant sur le fichier de configuration, puis accédez à l'onglet "Paramètres". Cliquez sur "Ajouter un Paramètre" et le nom du nouveau paramètre ‘JobDailySchedule " et définissez sa valeur sur 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.
Ensuite, à l'aide de la JobSchedule horaire quotidien de travail en utilisant le calendrier défini dans le Rôle du fichier de configuration.
var schedule = new JobSchedule();
schedule.ScheduleDailyJob("JobDailySchedule",
typeof(DailyJob));
Le DailyJob mise en œuvre se déroule comme suit. Puisque c'est une démo, je vais pas ajouter de la logique spécifique à l'emploi.
public class DailyJob : IJob
{
public void Execute(IJobExecutionContext context)
{
//Do your daily work here
}
}
Le JobSchedule enveloppe le Quartz.Net IScheduler. Dans un post précédent, j'ai parlé de l'importance de l'emballage de votre 3ème partie outils, c'est un excellent exemple car je suis contenant le travail de planification logique et je pourrait potentiellement changer cette logique sans affecter le code à l'aide de la JobSchedule.
Le JobSchedule doit être configuré lorsque le Rôle démarre et la JobSchedule instance doit être maintenue tout au long de la Rôle de sa vie. La modification de l'annexe peut être obtenue en changeant le ‘JobDailySchedule' paramètre via le Portail de Gestion Windows Azure en vertu de la section configurer de vos services cloud. Ensuite, pour appliquer le nouveau barème, redémarrez l'instance de Rôle à travers le Portail de Gestion Windows Azure en vertu de la section instances de vos services cloud.
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);
});
}
}