2010-05-05 18 views
5

In Quarts, è possibile utilizzare un singolo trigger per pianificare più lavori, in modo che tutti i lavori vengano eseguiti in parallelo. Qual è il modo migliore per farlo.Quarzo: attivazione di più lavori

Esempio, ogni ora esegue i lavori j1, j2, ..., jn in parallelo. Supponendo che non vi sia alcuna dipendenza tra i lavori.

risposta

1

È possibile creare un processo di trigger che attiva gli altri processi. Rendilo configurabile usando le proprietà JobMap e puoi riutilizzare la classe per attivare un insieme arbitrario di lavori (e magari eseguire il primo per te stesso).

+0

Idealmente, non si dovrebbe fare queste cose perché non è il modo giusto di pianificazione dei processi –

8

Non è possibile associare più processi con lo stesso trigger (un determinato lavoro può avere più trigger, ma non viceversa), ma è possibile impostare più trigger identici, uno per ogni lavoro.

Per farle funzionare in parallelo, è necessario assicurarsi che il pool di thread di Quartz abbia una capacità sufficiente per farlo. Vedere here per le opzioni di configurazione per il pool di thread.

+1

Link è morto. Per favore correggi se puoi –

0

ho finito per fare un aiuto funzione 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"); 
    } 
} 
Problemi correlati