日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

第三节: Quartz.Net五大构件之Scheduler(创建、封装、基本方法等)和Job(创建、关联等)

發(fā)布時(shí)間:2023/12/10 asp.net 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第三节: Quartz.Net五大构件之Scheduler(创建、封装、基本方法等)和Job(创建、关联等) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一. 五大構(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。