unas semanas escribí acerca del uso de Quartz.Net para programar trabajos en roles de trabajo de Windows Azure. Desde entonces, me encontré con un requisito que me empujó a crear un contenedor en torno al programador Quartz.Net IScheduler. JobSchedule tiene la responsabilidad de leer una cadena de programación del CloudConfigurationManager y programar un trabajo.
CloudConfigurationManager lee la configuración del archivo de configuración de la función, que se puede editar a través del Portal de administración de Windows Azure en la sección de configuración de los servicios en la nube.
El siguiente ejemplo programará un trabajo que debe ejecutarse todos los días a las 6:00 AM, 8:00 AM, 10 AM, 12:30 PM ya las 4:30 PM. La programación se define en la configuración de la función que se puede editar a través de Visual Studio. Para llegar a la configuración de roles, vaya a su proyecto de servicio de nube de Windows Azure y encuentre las configuraciones de rol deseadas en la carpeta Rol. Abra el editor de configuración haciendo doble clic en el archivo de configuración, luego vaya a la pestaña 'Configuración'. Haga clic en 'Agregar configuración' y asígnele un nombre a la nueva configuración 'JobDailySchedule' y establezca su valor en 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.
Luego, utilizando el JobSchedule programar un trabajo diario con el calendario definido en el archivo de configuración del papel.
var schedule = new JobSchedule();
schedule.ScheduleDailyJob("JobDailySchedule",
typeof(DailyJob));
La implementación de DailyJob es la siguiente. Como se trata de una demostración, no añadiré ninguna lógica específica al trabajo.
public class DailyJob : IJob
{
public void Execute(IJobExecutionContext context)
{
//Do your daily work here
}
}
JobSchedule se ajusta al programador Quartz.Net IScheduler. En una publicación anterior hablé sobre la importancia de adaptar las herramientas de terceros, este es un excelente ejemplo porque contengo la lógica de programación de trabajos y podría potencialmente cambiar esta lógica sin afectar el código que está usando JobSchedule.
El JobSchedule debe configurarse cuando se inicia el rol y la instancia de JobSchedule se debe mantener a lo largo de la vida del rol. Se puede cambiar el horario cambiando la configuración 'JobDailySchedule' a través del Portal de administración de Windows Azure en la sección de configuración de sus servicios en la nube. Luego, para aplicar la nueva programación, reinicie la instancia de Role a través del Portal de administración de Windows Azure en la sección de instancias de sus servicios en la nube.
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);
});
}
}
¿Podría actualizar las publicaciones, etc., que utiliza la última versión? Parece que el formato para los valores de configuración es diferente ahora. ¡Gracias! – Snowy
Creo que el nuevo camino para 2.x es: # export este servidor para comunicación remota contexto quartz.scheduler.exporter.type = Quartz.Simpl.RemotingSchedulerExporter, cuarzo quartz.scheduler.exporter.port = 555 cuarzo. scheduler.exporter.bindName = QuartzScheduler quartz.scheduler.exporter.channelType = tcp quartz.scheduler.exporter.channelName = httpQuartz – NickG
Agh. ¡Odio cómo no puedes tener nuevas líneas en los comentarios! – NickG