第三节: Quartz.Net五大构件之Scheduler(创建、封装、基本方法等)和Job(创建、关联等)
一. 五大構(gòu)件
引言:?Quartz.Net的五大構(gòu)件
1. ?調(diào)度器:Scheduler
2. ?作業(yè)任務(wù):Job
3. ?觸發(fā)器: Trigger
4. ?線程池: SimpleThreadPool
5. ?作業(yè)持久化:JobStore
?
?
二. Scheduler詳解
1. 創(chuàng)建Scheduler的兩種方式
(1). 直接通過(guò)StdSchedulerFactory類的GetDefaultScheduler方法創(chuàng)建
(2). 先創(chuàng)建StdSchedulerFactory,然后通過(guò)GetScheduler方法創(chuàng)建. 該方式可以在實(shí)體化StdSchedulerFactory的時(shí)候配置一些額外的信息,比如:配置SimpleThreadPool的個(gè)數(shù)、RemoteScheduler的遠(yuǎn)程控制、數(shù)據(jù)庫(kù)的持久化等。(都在后續(xù)章節(jié)介紹)
2. Scheduler的簡(jiǎn)單封裝
這里提供兩種思路,一種是單例的模式封裝,另一種是利用線程槽的模式封裝
(1). 單例模式:是指無(wú)論多少個(gè)用戶訪問(wèn),都只有一個(gè)實(shí)例,在web端上常用 (詳見:MySchedulerFactory類)
(2). 線程槽模式:是指單個(gè)用戶的單次鏈接,在未斷開連接之前,只有一個(gè)實(shí)例,下次重新連接,實(shí)例將重新創(chuàng)建(詳見:MySchedulerFactory2類)
代碼分享:
1 /// <summary>2 /// 將Sheduler封裝成單例模式,解決多線程多用戶不唯一的問(wèn)題3 /// </summary>4 public class MySchedulerFactory5 {6 /// <summary>7 /// 靜態(tài)變量:由CLR保證,在程序第一次使用該類之前被調(diào)用,而且只調(diào)用一次8 /// </summary>9 private static IScheduler _Scheduler = StdSchedulerFactory.GetDefaultScheduler(); 10 public static IScheduler CreateScheduler() 11 { 12 return _Scheduler; 13 } 14 } 15 /// <summary> 16 /// 通過(guò)線程槽進(jìn)行一個(gè)優(yōu)化 17 /// </summary> 18 public class MySchedulerFactory2 19 { 20 public static IScheduler CreateScheduler() 21 { 22 IScheduler scheduler = CallContext.GetData(typeof(MySchedulerFactory2).Name) as IScheduler; 23 if (scheduler == null) 24 { 25 scheduler = StdSchedulerFactory.GetDefaultScheduler(); 26 CallContext.SetData(typeof(MySchedulerFactory2).Name, scheduler); 27 } 28 return scheduler; 29 } 30 }3. Scheduler的基本方法:
(1). 開啟:Start
(2). 關(guān)閉:ShutDown
(3). 暫停job或Trigger:PauseAll、PauseJob、PauseJobs、PauseTrigger、PauseTriggers
(4). 恢復(fù)job或Trigger:ResumeAll、ResumeJob、ResumeJobs、ResumeTrigger、ResumeTriggers
(5). 將job和trigger加入Scheduler中:ScheduleJob
(6). 添加Job:AddJob
PS:更多方法以及如何封裝使用,將在后面的框架章節(jié)介紹
?分享一段完成的代碼:
?View Code
?
三. Job詳解
1. 幾個(gè)類型
①. JobBuilder:用來(lái)創(chuàng)建JobDetail。
②. IJob:具體作業(yè)任務(wù)需要實(shí)現(xiàn)該接口,并實(shí)現(xiàn)里面的方法
③. IJobDetail:用來(lái)定義工作實(shí)例
2. job的創(chuàng)建有兩種形式:
①.Create的泛型方式:寫起來(lái)代碼簡(jiǎn)潔方便。
②.反射+OfType的方式:用于后期動(dòng)態(tài)綁定,通過(guò)程序集的反射
1 //1 (Create的泛型方式)2 IJobDetail job1 = JobBuilder.Create<HelloJob2>()3 .UsingJobData("name", "ypf")4 .UsingJobData("age", "12")5 .WithIdentity("job1", "myJob1")6 .WithDescription("我是用來(lái)對(duì)該job進(jìn)行描述的")7 .StoreDurably(true)8 .Build();9 10 //2 (反射+OfType的方式) 11 //通過(guò)反射來(lái)創(chuàng)建類 12 var type = Assembly.Load("QuartzDemo").CreateInstance("QuartzDemo.HelloJob2"); 13 //OfType的方式加載類型 14 IJobDetail job2 = JobBuilder.Create().OfType(type.GetType()) 15 .UsingJobData("name", "ypf") 16 .UsingJobData("age", "12") 17 .StoreDurably(true) 18 .Build();3.常用的幾個(gè)方法
①.UsingJobData:給Job添加一些附加值,存儲(chǔ)在JobDataMap里,可以在具體的Job中獲取。(通過(guò)context.JobDetail.JobDataMap獲取)
②.StoreDurably:讓該job持久化,不被銷毀.(默認(rèn)情況下為false,即job沒(méi)有對(duì)應(yīng)的trigger的話,job就被銷毀)
③.WithIdentity:身份標(biāo)記,給job起個(gè)名稱,便于和Trigger關(guān)聯(lián)的時(shí)候使用.
④.WithDescription:用來(lái)對(duì)job進(jìn)行描述,并沒(méi)有什么實(shí)際作用
分享完整代碼:
/// <summary>/// Job詳解/// </summary>public static void JobShow(){//1. 創(chuàng)建ScheduleIScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();//2. 創(chuàng)建Job//2.1 (Create的泛型方式)IJobDetail job1 = JobBuilder.Create<HelloJob2>().UsingJobData("name", "ypf").UsingJobData("age", "12").WithIdentity("job1", "myJob1").WithDescription("我是用來(lái)對(duì)該job進(jìn)行描述的").StoreDurably(true).Build();//2.2 (反射+OfType的方式)//通過(guò)反射來(lái)創(chuàng)建類var type = Assembly.Load("QuartzDemo").CreateInstance("QuartzDemo.HelloJob2");//OfType的方式加載類型IJobDetail job2 = JobBuilder.Create().OfType(type.GetType()).UsingJobData("name", "ypf").UsingJobData("age", "12").StoreDurably(true).Build();IJobDetail job3 = JobBuilder.Create(type.GetType()).UsingJobData("name", "ypf").UsingJobData("age", "12").StoreDurably(true).Build();//3. 創(chuàng)建TriggerITrigger trigger = TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(1).RepeatForever()).Build();//4. 將Job和Trigger加入調(diào)度器中//scheduler.ScheduleJob(job1, trigger);//scheduler.ScheduleJob(job2, trigger);scheduler.ScheduleJob(job3, trigger);//5. 開始調(diào)度scheduler.Start();}/// <summary>/// 實(shí)現(xiàn)IJob接口/// </summary>class HelloJob2 : IJob{void IJob.Execute(IJobExecutionContext context){var name = context.JobDetail.JobDataMap["name"];var age = context.JobDetail.JobDataMap["age"];Console.WriteLine("name值為:{0},age值為:{1}", name, age);}}運(yùn)行結(jié)果:
4. Job和觸發(fā)器關(guān)聯(lián)的形式:1對(duì)1、1對(duì)多、多對(duì)1
?(PS:在下面Trigger處詳細(xì)介紹)
?
?
總結(jié)
以上是生活随笔為你收集整理的第三节: Quartz.Net五大构件之Scheduler(创建、封装、基本方法等)和Job(创建、关联等)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 男子为741元退款被骗143万:15张卡
- 下一篇: asp.net ajax控件工具集 Au