Quartz:触发多个作业

时间:2010-05-05 14:57:21

标签: java quartz-scheduler

在Quarts中,我可以使用单个触发器来安排多个作业,以便所有作业并行执行。什么是最好的方法。

例如,每小时并行执行Jobs j1,j2,...,jn。假设作业之间没有依赖关系。

3 个答案:

答案 0 :(得分:8)

您无法将多个作业与同一触发器关联(给定作业可以有多个触发器,反之亦然),但您可以设置多个相同的触发器,每个作业对应一个。

为了让它们并行运行,您需要确保Quartz的线程池有足够的容量来执行此操作。有关线程池的配置选项,请参阅here

答案 1 :(得分:1)

您可以构建触发其他作业的触发器作业。通过使用JobMap属性使其可配置,您可以重用该类来触发任意一组作业(并且可能自己执行第一个作业)。

答案 2 :(得分: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");
    }
}