2009-08-31 22 views

Respuesta

74

Tiene un par de opciones, dependiendo de lo que quiera hacer y cómo quiera 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 ejecutar incrustada, a continuación, puede iniciar el servidor desde el Global.asax decir, como este (de los ejemplos de 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 se ejecuta como un servicio, que le conecta remotamente a ella como esto (del ejemplo nº 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 planificador (ya sea a través de la interacción remota o porque tiene una instancia incrustado) se 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 algunos mensajes que escribí para la gente empezar con Quartz.Net: hace http://jvilalta.blogspot.com/2009/03/getting-started-with-quartznet-part-1.html

+1

¿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

+0

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

+0

Agh. ¡Odio cómo no puedes tener nuevas líneas en los comentarios! – NickG

2

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