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