什么是Quartz.Net
计划任务,定时框架。大到可以做灾难转移 负载均衡。小到可以做定时生成数据,数据更新等等。
官网 http://www.quartz-scheduler.org/ Quartz.Net是Quartz JAVA版本的移植版本,所以http://www.quartz-scheduler.org/介绍的也是java版本的, .net的官网是https://www.quartz-scheduler.net/。
本文使用quartz版本3.0.2(VS2017打开 C#7.1)
quartz的官方项目还是很完整的。学习起来很方便。
计划任务包含的元素
Scheduler-调度器
任务的管理、协调者。
像一个工厂中流水线的管理员,管理各个流水线的工作。
JOB-作业
就是要执行什么动作。
像工厂中每个流水线具体执行的什么工作。
TRIGGER-触发器
就是什么时候什么条件执行。
像工厂中每个流水线的工作时间表。
创建一个简单任务
private async void button1_Click(object sender, EventArgs e) { ISchedulerFactory sf = new StdSchedulerFactory(); //开启10+1个线程 只不过都是等待状态 IScheduler sched =await sf.GetScheduler(); Console.WriteLine("任务开始"); //会激活调度线程 从jobstore中读取快要执行的trigger,然后获取相关联的job进行执行 await sched.Start(); IJobDetail job = JobBuilder.Create<MyJob1>().WithDescription("工作任务描述1").WithIdentity("job1", "group1").Build(); //DateTimeOffset时间偏移,一般UTC是世界统一时间,世界各地时区不同(TimeZoneInfo),世界就不一样,所以每一个地方都有自己的时间偏移量 DateTimeOffset runtime = DateBuilder.EvenSecondDateAfterNow(); ITrigger trigger = TriggerBuilder.Create().WithIdentity("trigger1", "group1").WithSimpleSchedule(t=>t.WithIntervalInSeconds(1).RepeatForever()).Build(); //开始调度任务 await sched.ScheduleJob(job, trigger); await Task.Delay(TimeSpan.FromSeconds(60)); Console.WriteLine("任务结束"); await sched.Shutdown(true); }
Quartz中的几个构件
1、Scheduler 调度器 (一个大的容器)
2、Job
3、Trigger
一个job可以有多个trigger
4、Simplethreadpool (10+1的关系)
最终的执行都是委托给线程池执行的。 默认 10个线程池叫做workthread, 一个是调度线程叫做 quartzschedulerthread(作用获取到当前快要执行的线程)。他们都集成quartzthread
他是quartz默认的线程池,在thread上面封装的
5、JobStore
分为dbstore 和 ramstore
多线程介绍 http://www.cnblogs.com/wudequn/p/7571039.html
用到设计模式
抽象工厂
ISchedulerFactory
StdSchedulerFactory : ISchedulerFactory
DirectSchedulerFactory : ISchedulerFactory
建造者
链式建造
TriggerBuilder
JobBuilder
DateBuilder
(构建过程是稳定的
国建过程都是返回当前类的引用。方便链式构造
)
可插拔式,IOC模式
先读取配置文件中配置的,要是没有就默认一个。这样组件就可以被替换。
AOP
public class MyJobListener1 : IJobListener { public string Name { get { return "L1"; } } public Task JobExecutionVetoed(IJobExecutionContext context, CancellationToken cancellationToken = default(CancellationToken)) { return Task.Factory.StartNew(() => { Console.WriteLine("JobExecutionVetoed"); }); } public Task JobToBeExecuted(IJobExecutionContext context, CancellationToken cancellationToken = default(CancellationToken)) { return Task.Factory.StartNew(() => {//执行前 Console.WriteLine("JobToBeExecuted"); }); //throw new NotImplementedException(); } public Task JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException, CancellationToken cancellationToken = default(CancellationToken)) { return Task.Factory.StartNew(() => { //执行后 Console.WriteLine("JobWasExecuted"); }); } }
sched.ListenerManager.AddJobListener(new MyJobListener1(), GroupMatcher<JobKey>.AnyGroup());
Quartz.Net优点
数据库持久化
支持集群
可视化管理界面web
事件灵活控制cron