Cómo usar Quartz.net con ASP.NET
(2)
No sé cómo usar Quartz.dll en ASP.NET. ¿Dónde escribir el código para programar trabajos para desencadenar correos cada mañana? Por favor, si algún cuerpo lo sabe, ayúdenme ...
Editar: ¿Encontré CÓMO usar Quartz.NET en modo PRO? ser realmente útil.
Hace unas semanas escribí sobre el 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.
El CloudConfigurationManager lee la configuración del archivo de configuración del Rol, que se puede editar a través del Portal de administración de Windows Azure en la sección de configuración de sus servicios en la nube.
El siguiente ejemplo programará un trabajo que se debe ejecutar 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 JobSchedule, programe un trabajo diario utilizando la programación definida en el archivo de configuración de la función.
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 ajusta el 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.
JobSchedule se debe configurar cuando se inicia la función y la instancia de JobSchedule se debe mantener a lo largo de la vida de la función. 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);
});
}
}
Tienes un par de opciones, dependiendo de lo que quieras hacer y cómo quieras configurarlo. Por ejemplo, puede instalar un servidor Quartz.Net como un servicio de Windows independiente o también puede incrustarlo dentro de su aplicación asp.net.
Si desea ejecutarlo incrustado, puede iniciar el servidor desde, por ejemplo, su global.asax, de esta manera (a partir de los ejemplos del código fuente, ejemplo # 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();
Si lo ejecuta como un servicio, se conectaría remotamente a él de esta manera (del ejemplo # 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();
Una vez que tenga una referencia al programador (ya sea a través de la comunicación remota o porque tiene una instancia incrustada) puede programar trabajos como este:
// 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);
Aquí hay un enlace a algunas publicaciones que escribí para personas que comenzaron a utilizar Quartz.Net: http://jvilalta.blogspot.com/2009/03/getting-started-with-quartznet-part-1.html