Quartz.Net—初識

什麼是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"); }); } }
View Code

sched.ListenerManager.AddJobListener(new MyJobListener1(), GroupMatcher<JobKey>.AnyGroup());

Quartz.Net優勢

數據庫持久化

支持集羣

可視化管理界面web

事件靈活控制cron

相關文章
相關標籤/搜索