Quartz.Net是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植版本。
Quartz.Net的官方网址是:http://quartznet.sourceforge.net/
下载下来后,可以看到具有源代码,在使用之余可以看看具体实现。
概念:
调度(Scheduler):
作业(Job):
触发器(Trigger):
简单使用:
1.首先从下载包中提取出 bin/{.net framework version}/Release/Quartz 文件中的 Common.Logging.dll 和 Quartz.dll
其是 Comm.Logging.Dll是日志管理类。
2.把上述两个Dll引用至项目中
3.要实现作业调度类必需要实现IJob接口,此接口位于 Quartz 命名空间下面
public class MyJob : IJob { #region IJob 成员 public void Execute(JobExecutionContext context) { //在这儿写你的代码 Console.WriteLine("Called"); } #endregion }
转到IJob的定义会发现:Instances of this interface must have a public no-argument constructor. Quartz.JobDataMap
provides a mechanism for 'instance member data' that may be required by some
implementations of this interface.
意思是:必需为这个IJob的实现类提供公有的无参构造函数
public class MyJobExample { public void Test() { ISchedulerFactory schedulerFactory = new StdSchedulerFactory();//调度工厂 IScheduler scheudler = schedulerFactory.GetScheduler();//得到一个客户端可用的调度实列 JobDetail jobDetail = new JobDetail("Job", "Group", typeof(MyJob));//作业 SimpleTrigger trigger = new SimpleTrigger("Trigger","Group", TriggerUtils.GetEvenMinuteDate(DateTime.UtcNow));//实例化一个简单的触发器,执行时间是当前时间的下一分钟 scheudler.ScheduleJob(jobDetail, trigger);//加入到调度 scheudler.Start();//开始执行调度 } }
其中 TriggerUtils类中提供了很多静态方法,以使我们更好的使用Trigger.
如上面的: DateTime TriggerUtils.GetEvenMinuteDate(DateTime? dateUtc);//就是得到给定时间的下一分钟
DateTime TriggerUtils.GetEvenHourDate(DateTime? dateUtc);
DateTime TriggerUtils.GetEvenSecondDate(DateTime? dateUtc);
DateTime TriggerUtils.GetEvenSecondDateBefore(DateTime? dateUtc);
Trigger TriggerUtils.MakeHourlyTrigger();
Trigger TriggerUtils.MakeHourlyTrigger(int intervalInHours);
.........
其中 Trigger 中可以指定很多与调度策略相关的参数,如重复执行的次数,重复执行的时间间隔等,通过里面其方法还能得到第一次和最终后一次,以及给定时间的上一次和下一次执行时间(如果有)等等 返回参数一般都为 可空的 DateTime?
如常见的:
Trigger.RepeatCount = 2;//重复2次,加上第一次执行,总计执行3次,每次执行仍会去实列化MyJob类
Trigger.RepeatInterval = TimeSpan.FromSeconds(3);//如果指定RepeatCount 属性,则此属性不可为00:00:00
通过里面的方法可以得到作业第一次开始时间,最后时间,以及调用多少次,上一次和下一次的时间等等。
最后通过 Schedluer.Start()方法开执行作业调度
可以通过Schedluer.Shutdown来关闭作业调度,使用此方法后不能再次开启。
Schedluer提供了对作业和触发器以及作业和触发器监听等处理。