您的位置:首页 > 其它

Quartz.NET学习系列(十)--- 触发器执行优先级

2015-03-14 21:05 260 查看
在使用Quartz.NET的时候可能会碰到这样一种情况,多个触发器触发同一个任务时,当多个触发器触发的时间相互冲突时,也就是在同一时间触发同一个任务,这时候就需要有一个触发的优先级了,即由哪个触发器来触发,如果不设置优先级的话,Quartz.NET会按照默认的方式处理。设置优先级的代码如下:

public class TriggerEchoJob : IJob
{
private ILog log = LogManager.GetLogger(typeof (TriggerEchoJob));
public void Execute(IJobExecutionContext context)
{
log.Info("触发器: " + context.Trigger.Key);
}

}
public class PriorityExample
{

public static void Run()
{
ILog log = LogManager.GetLogger(typeof (PriorityExample));

NameValueCollection properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "PriorityExampleScheduler";

properties["quartz.threadPool.threadCount"] = "1";
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
properties["quartz.jobStore.type"] = "Quartz.Simpl.RAMJobStore, Quartz";
ISchedulerFactory sf = new StdSchedulerFactory(properties);
IScheduler sched = sf.GetScheduler();

IJobDetail job = JobBuilder.Create<TriggerEchoJob>()
.WithIdentity("TriggerEchoJob")
.Build();
DateTimeOffset startTime = DateBuilder.FutureDate(5, IntervalUnit.Second);

ITrigger trigger1 = TriggerBuilder.Create()
.WithIdentity("Priority1Trigger5SecondRepeat")
.StartAt(startTime)
.WithSimpleSchedule(x => x.WithRepeatCount(1).WithIntervalInSeconds(5))
.WithPriority(1)
.ForJob(job)
.Build();

ITrigger trigger2 = TriggerBuilder.Create()
.WithIdentity("Priority5Trigger10SecondRepeat")
.StartAt(startTime)
.WithSimpleSchedule(x => x.WithRepeatCount(1).WithIntervalInSeconds(10))
.ForJob(job)
.Build();
log.Info("默认优先级"+trigger2.Priority.ToString());
ITrigger trigger3 = TriggerBuilder.Create()
.WithIdentity("Priority10Trigger15SecondRepeat")
.StartAt(startTime)
.WithSimpleSchedule(x => x.WithRepeatCount(1).WithIntervalInSeconds(15))
.WithPriority(10)
.ForJob(job)
.Build();

sched.ScheduleJob(job, trigger1);
sched.ScheduleJob(trigger2);
sched.ScheduleJob(trigger3);

sched.Start();
log.Info("------- 计划开始 -----------------");
log.Info("------- 等待30秒 -------------");
Thread.Sleep(TimeSpan.FromSeconds(300));
sched.Shutdown(true);
log.Info("------- 计划关闭 -----------------");
}
}
如果不设置触发器的优先级,默认的优先级为5
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: