2010-05-05 211 views
5

在夸脱,我可以用一个触发器来调度多个就业机会,让所有的工作被并行执行。做这个的最好方式是什么。石英:触发多个作业

例,每隔一小时并行执行作业J1,J2,...,JN。假设这些作业之间不存在依赖关系。

回答

1

你可以建立触发其他作业触发任务。通过使用JobMap属性可以对其进行配置,并且可以重新使用该类来触发任意一组作业(也可以为自己执行第一组作业)。

+0

理想情况下,你不应该做这样的事情,因为它不是调度作业的正确方法 – 2016-12-01 11:45:42

8

你不能用相同的触发(一个给定的任务可以有多个触发器,但不是反之亦然)多项工作联系在一起,但你可以设置多个相同的触发器,每一个工作。

为了让他们并行运行,你需要确保Quartz的线程池有足够的能力这样做。有关线程池的配置选项,请参见here

+1

链接已经死了。如果可以,请纠正 – 2012-10-17 14:48:19

0

我最终作出一个帮助功能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"); 
    } 
}