在Quarts中,我可以使用单个触发器来安排多个作业,以便所有作业并行执行。什么是最好的方法。
例如,每小时并行执行Jobs j1,j2,...,jn。假设作业之间没有依赖关系。
答案 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");
}
}