2010-05-05 17 views
5

En Quarts, ¿puedo usar un solo disparador para programar trabajos múltiples, de modo que todos los trabajos se ejecuten en paralelo. Cuál es la mejor manera de hacer esto.Quartz: activación de varios trabajos

Ejemplo, cada hora ejecuta trabajos j1, j2, ..., jn en paralelo. Suponiendo que no hay dependencia entre los trabajos.

Respuesta

1

Puede generar un trabajo de desencadenador que active los otros trabajos. Hágalo configurable usando las propiedades JobMap, y puede reutilizar la clase para activar un conjunto arbitrario de trabajos (y quizás ejecutar el primero para usted).

+0

Lo ideal sería que no debe hacer este tipo de cosas, ya que no es la forma correcta de la programación de tareas –

8

No puede asociar varias tareas con el mismo desencadenador (un trabajo determinado puede tener múltiples activadores, pero no al revés), pero puede configurar múltiples desencadenantes idénticos, uno para cada trabajo.

Para que se ejecuten en paralelo, debe asegurarse de que el grupo de subprocesos de Quartz tenga suficiente capacidad para hacerlo. Consulte here para ver las opciones de configuración para el grupo de subprocesos.

+1

Enlace está muerto. Por favor corrige si puedes –

0

me terminó haciendo una función de ayuda GetTrigger

class Program 
{ 
    static void Main(string[] args) 
    { 
     Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter { Level = Common.Logging.LogLevel.Info };    

     IJobDetail jobOne = JobBuilder.Create<JobOne>() 
      .WithIdentity(typeof(JobOne).Name) 
      .Build(); 

     IJobDetail jobTwo = JobBuilder.Create<JobTwo>() 
      .WithIdentity(typeof(JobTwo).Name) 
      .Build(); 

     var jobOneTrigger = GetTrigger(new TimeSpan(0, 0, 5), jobOne); 
     var jobTwoTrigger = GetTrigger(new TimeSpan(0, 0, 5), jobTwo); 

     IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); 
     scheduler.ScheduleJob(jobOne, jobOneTrigger); 
     scheduler.ScheduleJob(jobTwo, jobTwoTrigger); 

     scheduler.Start(); 
    } 

    private static ITrigger GetTrigger(TimeSpan executionTimeSpan, IJobDetail forJob) 
    {    
     return TriggerBuilder.Create() 
      .WithIdentity(forJob.JobType.Name+"Trigger") 
      .StartNow() 
      .WithSimpleSchedule(x => x 
       .WithInterval(executionTimeSpan) 
       .RepeatForever()) 
      .ForJob(forJob.JobType.Name) 
      .Build(); 
    } 
} 

public class JobOne : IJob 
{ 
    public void Execute(IJobExecutionContext context) 
    { 
     Console.WriteLine("JobOne"); 
    } 
} 

public class JobTwo : IJob 
{ 
    public void Execute(IJobExecutionContext context) 
    { 
     Console.WriteLine("JobTwo"); 
    } 
} 
Cuestiones relacionadas