什麼是Quartz.Net
計劃任務,定時框架。大到能夠作災難轉移 負載均衡。小到能夠作定時生成數據,數據更新等等。html
官網 http://www.quartz-scheduler.org/ Quartz.Net是Quartz JAVA版本的移植版本,因此http://www.quartz-scheduler.org/介紹的也是java版本的, .net的官網是https://www.quartz-scheduler.net/。java
本文使用quartz版本3.0.2(VS2017打開 C#7.1)web
quartz的官方項目仍是很完整的。學習起來很方便。數據庫
計劃任務包含的元素
Scheduler-調度器設計模式
任務的管理、協調者。多線程
像一個工廠中流水線的管理員,管理各個流水線的工做。負載均衡
JOB-做業框架
就是要執行什麼動做。async
像工廠中每一個流水線具體執行的什麼工做。ide
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中的幾個構件
一、Scheduler 調度器 (一個大的容器)
二、Job
三、Trigger
一個job能夠有多個trigger
四、Simplethreadpool (10+1的關係)
最終的執行都是委託給線程池執行的。 默認 10個線程池叫作workthread, 一個是調度線程叫作 quartzschedulerthread(做用獲取到當前快要執行的線程)。他們都集成quartzthread
他是quartz默認的線程池,在thread上面封裝的
五、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