第八节:触发器
上节中学到了quartz 如何解析corn-like 表达式,其实触发器中最核心的地方就是处理时间,
这一节让我们来了解下quartz中的触发器有哪些吧:
我想大家一定首先想到的就是处理corn-like的触发器吧,它就是CronTriggerImpl触发器,还是看一下类图,看看有多少触发器,和它们之间的关系吧
如上图,所有的触发器继承了ITrigger接口和AbstractTrigger这个抽象类,类图稍微有点乱,但大概也能看清它们的关系。
正如我们看到的,我们罗列一下上图的触发器吧:
CronTriggerImpl 使用corn-like表达式的一个触发器,触发时机比较容易定制
CalendarIntervalTriggerImpl 根据日历的时间间隔重复执行的一个触发器
DailyTimeIntervalTriggerImpl 根据每天重复的时间间隔
SimpleTriggerImpl 简单的触发器,比如只执行一次这样的
我们稍微看一下ITrigger这个接口,就会发现TriggerKey相当于触发器的一个主键,唯一标识一个触发器,并且一个触发器关联一个JobKey(相当于作业主键),比如还有GetNextFireTimeUtc()这样类似的接口方法,这个方法应该是得到下一次执行作业的时间。也就是一个触发器对应一个作业。
我们在用quartz的时候,对实例化上面哪些触发器是不可见的,是由TriggerBuilder这个类完成的。
可以看一下这些Builder类的结构是怎么的,如下图:
很明显一个触发器对应一个builder了。
下面我们就简单的SimpleScheduleBuilder来完成一个例子吧:
1:job代码:很简单输出当前时间
public class MyJob : IJob
{
public void Execute(IJobExecutionContext context)
{
Console.WriteLine("我执行了,时间:{0}", DateTime.Now);
}
}
2:调度代码:
static void Main(string[] args)
{
//调度器
ISchedulerFactory sf = new StdSchedulerFactory();
IScheduler sched = sf.GetScheduler();
//job详情,注意MyJob
IJobDetail myJob = JobBuilder.Create<MyJob>()
.WithIdentity("job1", "group1")
.Build();
//触发器,用的简单触发器,每隔5秒执行一次
ITrigger trigger = TriggerBuilder.Create().WithSimpleSchedule(t => t.RepeatForever().WithIntervalInSeconds(5))
.WithIdentity("t1")
.Build();
//关联job和触发器
sched.ScheduleJob(myJob, trigger);
//执行
sched.Start();
Console.Read();
//关掉
sched.Shutdown(true);
}
3:执行结果 间隔5s执行:
总结:认识了quartz中的触发器
全部代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Quartz.Impl;
namespace Quartz.Demo
{
class Class5
{
static void Main(string[] args)
{
//调度器
ISchedulerFactory sf = new StdSchedulerFactory();
IScheduler sched = sf.GetScheduler();
//job详情,注意MyJob
IJobDetail myJob = JobBuilder.Create<MyJob>()
.WithIdentity("job1", "group1")
.Build();
//触发器,用的简单触发器,每隔5秒执行一次
ITrigger trigger = TriggerBuilder.Create().WithSimpleSchedule(t => t.RepeatForever().WithIntervalInSeconds(5))
.WithIdentity("t1")
.Build();
//关联job和触发器
sched.ScheduleJob(myJob, trigger);
//执行
sched.Start();
Console.Read();
//关掉
sched.Shutdown(true);
}
}
public class MyJob : IJob
{
public void Execute(IJobExecutionContext context)
{
Console.WriteLine("我执行了,时间:{0}", DateTime.Now);
}
}
}