2010-05-05 4 views
5

Dans Quarts, puis-je utiliser un seul déclencheur pour planifier plusieurs travaux afin que tous les travaux soient exécutés en parallèle. Quelle est la meilleure façon de procéder. Par exemple, toutes les heures, les Jobs j1, j2, ..., jn sont exécutés parallèlement. En supposant qu'il n'y a pas de dépendance entre les travaux.Quartz: déclenchement de plusieurs travaux

Répondre

1

Vous pouvez créer un travail déclencheur qui déclenche les autres travaux. Rendez-le configurable en utilisant les propriétés JobMap, et vous pouvez réutiliser la classe pour déclencher un ensemble arbitraire de tâches (et peut-être exécuter le premier pour vous-même).

+0

Idéalement, vous ne devriez pas faire des choses telles que ce n'est pas la bonne façon de la planification des travaux –

8

Vous ne pouvez pas associer plusieurs tâches avec le même déclencheur (un travail donné peut avoir plusieurs déclencheurs, mais pas l'inverse), mais vous pouvez configurer plusieurs déclencheurs identiques, un pour chaque travail. Pour les faire fonctionner en parallèle, vous devez vous assurer que le pool de threads de Quartz a suffisamment de capacité pour le faire. Voir here pour les options de configuration pour le pool de threads.

+1

Link est mort. Veuillez corriger si vous le pouvez –

0

je fini par faire une fonction d'aide 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"); 
    } 
} 
Questions connexes