惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

M
MIT News - Artificial intelligence
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
J
Java Code Geeks
G
Google Developers Blog
美团技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
腾讯CDC
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
The Blog of Author Tim Ferriss
月光博客
月光博客
B
Blog
WordPress大学
WordPress大学
云风的 BLOG
云风的 BLOG
博客园_首页
人人都是产品经理
人人都是产品经理
aimingoo的专栏
aimingoo的专栏
Y
Y Combinator Blog
Jina AI
Jina AI
S
SegmentFault 最新的问题
H
Help Net Security
博客园 - 聂微东
Microsoft Azure Blog
Microsoft Azure Blog
Google DeepMind News
Google DeepMind News

博客园 - Doho

支持手势的 Windows Mobile 工具条 【推荐】《精通.NET互操作:P/Invoke,C++ Interop和COM Interop》 荣获“微软精英大挑战”一等奖 [推荐]美名腾Beta版 [发布]Quartz.NET 示例程序:企业调度器 V0.2 源代码 Quartz.NET 架构与源代码分析系列 part 3 :Trigger 触发器 Quartz.NET 架构与源代码分析系列 part 1 :Quartz.NET 入门 Quartz.NET 架构与源代码分析系列 Silverlight Cards---Silverlight Streaming 的使用 Silverlight 2.0 Beta 2 xaml 命名空间问题的解决 .NET框架下的并行处理方案 Microsoft Parallel Extensions 微软中国有限公司董事长张亚勤博士来重庆大学演讲 Linq To Anything Community Server 的缓存方案 我的ASP.NET分页 微软亚洲研究院的“人立方”搜索 推荐一款任务栏加强软件 Image Cup,我和几位师兄一起奋战! 一款好玩的小软件
Quartz.NET 架构与源代码分析系列 part 2 :Job 作业
Doho · 2009-03-12 · via 博客园 - Doho

      在上一篇Quartz.NET 架构与源代码分析系列 part 1 :Quartz.NET 入门我们介绍了Quartz.NET 的基本知识和简单的应用,可以看出来它的使用是非常简单的,只要短短的几行代码就可以在自己的应用程序嵌入强大的作业调度功能。图1是调度器的原理示意图。

image

图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所示。

image
图2 JobExecutionContext 类图 

image
图3 JobDataMap 继承图

      它有一个存储作业执行时数据的重要属性:MergedJobDataMap,它是 JobDataMap 类型,也可以使用 JobExecutionContext.JobDetail.JobDataMap 来获得 JobDataMap 对象的引用。作为传递参数的容器,JobDataMap 间接继承了 DirtyFlagMap,DirtyFlagMap 内嵌了 Hashtable 容器,它有一组数据读写方法。可以使用 Visual Studio 的类图来查看。

有状态与无状态的作业

      以上我们的作业实例都是从 IJob 继承,Quartz.NET 里还有 IStatefulJob 、IInterruptableJob,它的声明方式为:

Code

      IInterruptableJob 接口提供了一个中断方法,但是 IStatefulJob 没有自己的方法。从 Quartz.NET 官方了解到:

一个 Job 实例可以被定义为“有状态的”或者“无状态的”。在执行无状态的任务过程中任何对 JobDataMap 所作的更改都将丢失。有状态的任务恰好相反,它在任务的每次执行之后重新存储 JobDataMap 。有状态任务的一个缺点就是它不能并发执行。也就是说,如果任务有状态,那么当触发器试图触发它,触发器就会被阻塞直到前面的执行完成。想使任务有状态,它就要实现 IStatefulJob 接口而不是实现IJob接口。

      从上面可以知道 IStatefulJob 应该有管理 JobDataMap 的方法,但这个接口在 Quartz.NET 1.0 版本还没有实现。预计在以后的版本应该会加强这个功能的。

示例效果

image

图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 触发器