Quartz.NET 架构与源代码分析系列 part 2 :Job 作业
????? 在上一篇Quartz.NET 架構(gòu)與源代碼分析系列 part 1 :Quartz.NET 入門我們介紹了Quartz.NET 的基本知識(shí)和簡(jiǎn)單的應(yīng)用,可以看出來(lái)它的使用是非常簡(jiǎn)單的,只要短短的幾行代碼就可以在自己的應(yīng)用程序嵌入強(qiáng)大的作業(yè)調(diào)度功能。圖1是調(diào)度器的原理示意圖。
圖1 調(diào)度器的原理示意圖
?
????? 從圖1可以看出,作業(yè)流程是在調(diào)度器的統(tǒng)一調(diào)度下完成的,它可以調(diào)度多個(gè)作業(yè),觸發(fā)器提供作業(yè)執(zhí)行的條件(每天 8:00 am),觸發(fā)器與作業(yè)關(guān)聯(lián),它們是 1:N 的關(guān)系,1個(gè)觸發(fā)器可以關(guān)聯(lián)1個(gè)或多個(gè)作業(yè)。
附帶的作業(yè)
????? 我們知道要實(shí)現(xiàn)自己的作業(yè)功能只要繼承 IJob 接口并實(shí)現(xiàn) Execute(JobExecutionContext context) 方法,再把它添加到調(diào)度器,調(diào)度器會(huì)調(diào)用執(zhí)行Execute(JobExecutionContext context) 方法。調(diào)用期間,調(diào)度器會(huì)跟蹤作業(yè)和它們的執(zhí)行次數(shù)。Quartz.NET 默認(rèn)提供了 FileScanJob 監(jiān)視某個(gè)文件是否被修改,NativeJob 執(zhí)行指定程序,NoOpJob 空操作用來(lái)給系統(tǒng)調(diào)用 ITriggerListener 、IJobListener ,以及 SendMailJob 郵件發(fā)送作業(yè)。
作業(yè)執(zhí)行上下文
????? 作業(yè)執(zhí)行上下文由 JobExecutionContext 類實(shí)現(xiàn),它的類圖如圖2所示。
|
|
|
????? 它有一個(gè)存儲(chǔ)作業(yè)執(zhí)行時(shí)數(shù)據(jù)的重要屬性:MergedJobDataMap,它是 JobDataMap 類型,也可以使用 JobExecutionContext.JobDetail.JobDataMap 來(lái)獲得 JobDataMap 對(duì)象的引用。作為傳遞參數(shù)的容器,JobDataMap 間接繼承了 DirtyFlagMap,DirtyFlagMap 內(nèi)嵌了 Hashtable 容器,它有一組數(shù)據(jù)讀寫(xiě)方法。可以使用 Visual Studio 的類圖來(lái)查看。
有狀態(tài)與無(wú)狀態(tài)的作業(yè)
????? 以上我們的作業(yè)實(shí)例都是從 IJob 繼承,Quartz.NET 里還有 IStatefulJob 、IInterruptableJob,它的聲明方式為:
Codepublic?interface?IStatefulJob?:?IJob?
????{?
????}
public?interface?IInterruptableJob?:?IJob?
????{?
????????void?Interrupt();?
????}
????? IInterruptableJob 接口提供了一個(gè)中斷方法,但是 IStatefulJob 沒(méi)有自己的方法。從 Quartz.NET 官方了解到:
一個(gè) Job 實(shí)例可以被定義為“有狀態(tài)的”或者“無(wú)狀態(tài)的”。在執(zhí)行無(wú)狀態(tài)的任務(wù)過(guò)程中任何對(duì) JobDataMap 所作的更改都將丟失。有狀態(tài)的任務(wù)恰好相反,它在任務(wù)的每次執(zhí)行之后重新存儲(chǔ) JobDataMap 。有狀態(tài)任務(wù)的一個(gè)缺點(diǎn)就是它不能并發(fā)執(zhí)行。也就是說(shuō),如果任務(wù)有狀態(tài),那么當(dāng)觸發(fā)器試圖觸發(fā)它,觸發(fā)器就會(huì)被阻塞直到前面的執(zhí)行完成。想使任務(wù)有狀態(tài),它就要實(shí)現(xiàn) IStatefulJob 接口而不是實(shí)現(xiàn)IJob接口。
????? 從上面可以知道 IStatefulJob 應(yīng)該有管理 JobDataMap 的方法,但這個(gè)接口在 Quartz.NET 1.0 版本還沒(méi)有實(shí)現(xiàn)。預(yù)計(jì)在以后的版本應(yīng)該會(huì)加強(qiáng)這個(gè)功能的。
示例效果
圖4 Quartz.NET 示例圖
????? 該示例還不夠完善,所以源代碼沒(méi)有傳上來(lái),計(jì)劃在下一篇就共享出來(lái)。
????? 下一篇文章我們將進(jìn)入第3 部分:Trigger 觸發(fā)器
?
參考文章
1.The Official Quartz.NET Tutorial
2.Quartz.net官方開(kāi)發(fā)指南 第三課:更多關(guān)于Jobs和JobDetails
?
目錄:?? Quartz.NET 架構(gòu)與源代碼分析系列
上一篇:Quartz.NET 架構(gòu)與源代碼分析系列 part 1 :Quartz.NET 入門
下一篇:Quartz.NET 架構(gòu)與源代碼分析系列 part 3 :Trigger 觸發(fā)器
轉(zhuǎn)載于:https://www.cnblogs.com/Doho/archive/2009/03/12/1410081.html
總結(jié)
以上是生活随笔為你收集整理的Quartz.NET 架构与源代码分析系列 part 2 :Job 作业的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: fckeditor2.63 上传图片的一
- 下一篇: Skype通讯协议分析