Quartz.NET的触发器比较多,但是常用的有两个分别是SimpleTrigger和CronTrigger,本篇学习下SimpleTrigger
SimpleTrigger 的创建方式如下:
ISimpleTrigger trigger = (ISimpleTrigger) TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartAt(startTime)
.Build();
ISimpleTrigger有较多方法,常用的方法有
StartAt(开始时间) WithSimpleSchedule(执行间隔次数等设置) ForJob(特定的任务触发器)
以下是应用的代码:
public class SimpleJob : IJob
{
private ILog log = LogManager.GetLogger(typeof(SimpleJob));
public virtual void Execute(IJobExecutionContext context)
{
JobKey jobKey = context.JobDetail.Key;
log.InfoFormat("任务: {0} 执行时间:{1}", jobKey, DateTime.Now.ToString());
}
}
public class SimpleTriggerExample
{
public static void Run()
{
ILog log = LogManager.GetLogger(typeof (SimpleTriggerExample));
ISchedulerFactory sf = new StdSchedulerFactory();
IScheduler sched = sf.GetScheduler();
DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(null, 5);
//job1在5秒之后运行
IJobDetail job = JobBuilder.Create<SimpleJob>()
.WithIdentity("job1", "group1")
.Build();
ISimpleTrigger trigger = (ISimpleTrigger) TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartAt(startTime)
.Build();
DateTimeOffset? ft = sched.ScheduleJob(job, trigger);
log.Info(job.Key +
" 开始时间: " + ft +
" 执行次数: " + trigger.RepeatCount +
" 执行间隔" + trigger.RepeatInterval.TotalSeconds);
// job2 每1秒执行一次,共执行6次(其中开始1此,重复5次)
job = JobBuilder.Create<SimpleJob>()
.WithIdentity("job2", "group1")
.Build();
trigger = (ISimpleTrigger) TriggerBuilder.Create()
.WithIdentity("trigger2", "group1")
.StartAt(startTime)
.WithSimpleSchedule(x => x.WithIntervalInSeconds(1).WithRepeatCount(5))
.Build();
ft = sched.ScheduleJob(job, trigger);
log.Info(job.Key +
" 开始时间: " + ft +
" 执行次数: " + trigger.RepeatCount +
" 执行间隔" + trigger.RepeatInterval.TotalSeconds);
//job2被替换 原来照常执行 组别不一样
trigger = (ISimpleTrigger) TriggerBuilder.Create()
.WithIdentity("trigger2", "group2")
.StartAt(startTime)
.WithSimpleSchedule(x => x.WithIntervalInSeconds(1).WithRepeatCount(2))
.ForJob(job)
.Build();
ft = sched.ScheduleJob(trigger);
log.Info(job.Key +
" 开始时间: " + ft +
" 执行次数: " + trigger.RepeatCount +
" 执行间隔" + trigger.RepeatInterval.TotalSeconds);
// job3 5秒后执行
job = JobBuilder.Create<SimpleJob>()
.WithIdentity("job3", "group1")
.Build();
trigger = (ISimpleTrigger) TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.StartAt(DateBuilder.FutureDate(5, IntervalUnit.Second))
.Build();
ft = sched.ScheduleJob(job, trigger);
log.Info(job.Key +
" 开始时间: " + ft +
" 执行次数: " + trigger.RepeatCount +
" 执行间隔" + trigger.RepeatInterval.TotalSeconds);
sched.Start();
log.Info("------- 开始计划 -----------------");
job = JobBuilder.Create<SimpleJob>()
.WithIdentity("job5", "group1")
.Build();
ISimpleTrigger trigger1 = (ISimpleTrigger)TriggerBuilder.Create()
.WithIdentity("trigger5", "group1")
.StartAt(startTime)
.WithSimpleSchedule(x => x.WithIntervalInSeconds(1).WithRepeatCount(2))
.Build();
ft = sched.ScheduleJob(job, trigger1);
log.Info(job.Key +
" 开始时间: " + ft +
" 执行次数: " + trigger1.RepeatCount +
" 执行间隔" + trigger1.RepeatInterval.TotalSeconds);
job = JobBuilder.Create<SimpleJob>()
.WithIdentity("job6", "group1")
.StoreDurably()
.Build();
sched.AddJob(job, true);
log.Info("job6触发...");
sched.TriggerJob(new JobKey("job6", "group1"));
log.Info("------- 等待20秒 --------------");
Thread.Sleep(TimeSpan.FromSeconds(20));
sched.Shutdown(true);
log.Info("------- 关闭计划 -----------------");
SchedulerMetaData metaData = sched.GetMetaData();
log.Info(string.Format("执行任务数:{0}", metaData.NumberOfJobsExecuted));
}
}