基于Quartz开发企业级任务调度应用(1)(2)
数据存储
Quartz 中的 trigger 和 job 需要存储下来才能被使用。Quartz 中有两种存储方式:RAMJobStore, JobStoreSupport,其中 RAMJobStore 是将 trigger 和 job 存储在内存中,而 JobStoreSupport 是基于 jdbc 将 trigger 和 job 存储到数据库中。RAMJobStore 的存取速度非常快,但是由于其在系统被停止后所有的数据都会丢失,所以在通常应用中,都是使用 JobStoreSupport。
在 Quartz 中,JobStoreSupport 使用一个驱动代理来操作 trigger 和 job 的数据存储:StdJDBCDelegate。StdJDBCDelegate 实现了大部分基于标准 JDBC 的功能接口,但是对于各种数据库来说,需要根据其具体实现的特点做某些特殊处理,因此各种数据库需要扩展 StdJDBCDelegate 以实现这些特殊处理。Quartz 已经自带了一些数据库的扩展实现,可以直接使用,如下图所示:
图 4. Quartz 数据库驱动代理
作为嵌入式数据库的代表,Derby 近来非常流行。如果使用 Derby 数据库,可以使用上图中的 CloudscapeDelegate 作为 trigger 和 job 数据存储的代理类。
基本开发流程及简单实例
搭建开发环境
利用 Quartz 进行开发相当简单,只需要将下载开发包中的 quartz-all-1.8.4.jar 加入到 classpath 即可。根据笔者的经验,对于任务调度功能比较复杂的企业级应用来说,最好在开发阶段将 Quartz 的源代码导入到开发环境中来。一方面可以通过阅读源码了解 Quartz 的实现机理,另一方面可以通过扩展或修改 Quartz 的一些类来实现某些 Quartz 尚不提供的功能。
图 5. Quartz 实例工程及源码导入
上图中左边是源码导入后的截图,其中 org.quartz.* 即为 quartz 的源码。导入源码后可能会有一些编译错误,通常出现在 org.quartz.ee.* 和 org.quartz.jobs.ee.* 包中。下载开发包中有一个 lib 目录,读者可以将该目录下的 jar 文件加入到编译环境。如果还有编译错误,读者可以参考上图中右侧的 jar 列表,到网上去搜索下载。
项目中 com.ibm.zxn.sample.quartz 是我们自己的类包,下面的实例中我们会用到它。
一个简单实例
Quartz 开发包中有一个 examples 目录,其中有 15 个基本实例。建议读者阅读并实践这些例子。本文这里只列举一个小的实例,介绍基本的开发方法。
准备数据库和 Quartz 用的数据表
图 6. Quartz 数据表
本文使用 IBM DB2 数据库:将 jdbc 驱动程序 db2jcc.jar 加入到项目中;
在数据库中创建一个新库 QUARTZDB;
执行 /quartz-1.8.4/docs/dbTables/tables_db2_v8.sql,创建数据表;表建好后如下所示:
准备配置文件,加入到项目中
图 7. 实例配置文件
通过实现 job 接口定义我们自己的任务类,如下所示:
图 8. 定义任务类
然后,实现任务调度的主程序,如下所示:
本实例中,我们利用 DateIntervalTrigger 实现一个每两分钟执行一次的任务调度。
图 9. 实现主程序
完成后项目结构如下所示:
图 10. 实例项目结构图
运行程序,查看数据库表和运行结果
数据库中,QRTZ_TRIGGERS 表中添加了一条 trigger 记录,如下所示:
图 11. QRTZ_TRIGGERS 表中的记录
QRTZ_JOB_DETAILS 表中添加了一条 job 记录,如下所示:
图 12. QRTZ_JOB_DETAILES 表中的记录
从运行结果来看,任务每两分钟被执行一次:
图 13. 运行结果
用户点评