转载

【Quartz指南】JobStores

JobStore负责保存所有配置到调度器里的工作数据:jobs,triggers,calendars等等。在用SchedulerFactory得到一个调度器的实例时,我们可以给SchedulerFactory提供一个属性文件或者一个属性对象来声明使用哪个JobStore。 注意,不要在代码里使用JobStore的实例,这些Quartz都做好了。我们要做的就仅仅告诉Quartz(通过配置)用哪个JobStore,然后就调用Scheduler接口函数了。

RAMJobStore

利用内存来持久化调度程序信息。这种作业存储类型最容易配置、构造和运行,但是当应用程序停止运行时,所有调度信息将被丢失。 在属性文件里指定: org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

JDBCJobStore

支持的数据库有:Oracle, MySQL, MS SQLServer2000, HSQLDB, PostreSQL and DB2。使用JDBCJobStore,首先要在数据库里建一些Quartz要使用的表。我们可以使用Quartz发布包里的建表脚本,在docs/dbTables目录下。如果没有你所要的数据库类型的脚本,可以在已有的脚本作一些修改。所有这些标都是以“QRTZ_”作为前缀的,这个前缀是可以在属性文件里更改的。在为多个调度器实例创建多个系列的表时,用不同的前缀是很有用的。 一旦我们创建了这些表,在配置和触发JDBCJobStore之前就要做更多的事情了。我们需要决定应用需要哪种类型的事务处理。如果我们不需要给其他的事务处理一些调度命令(增加删除trigger),我们就可以让Quartz利用JobStoreTX处理这个事务(这用的很多)。 如果我们需要Quartz和其他的事务处理(在J2EE应用服务器里)一起工作,我们就应该用JobStoreCMT-这会使Quartz让应用服务器容器管理事务。 最后一点是从哪个JDBCJobStore启动数据库能够得到该数据库的连接。在属性文件里是用一个不同的方法来定义数据源的。一种是Quartz自己创建和管理数据源-提供所有的数据库连接信息;另外一种是利用应用服务器管理的数据源,其中Quartz运行在这个应用服务器里-给JDBCJobStore提供数据库的JNDI名称。 用JDBCJobStore(假设我们是用的StdSchedulerFactory),我们首先要设置org.quartz.jobStore.class属性为org.quartz.impl.jdbcjobstore.JobStoreTX或者org.quartz.impl.jdbcjobstore.JobStoreCMT,这取决于我们的选择。 org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX 下一步,我们需要选择一个驱动代理。StdJDBCDelegate是一个用“vanilla”JDBC代码实现的代理。如果没有其他为你数据库指定的代理,就使用这个。Quartz开发者们解决的问题都是根据这个代理的来实现的。其他的代理在org.quartz.impl.jdbcjobstore包或者子包里。包括DB2v6Delegate(DB2 version 6 或早期版本使用的),HSQLDBDelegate(HSQLDB使用),MSSQLDelegate(microsoft SQLServer 2000使用),PostgreSQLDelegate(PostgreSQL 7.x使用),WeblogicDelegate(Weblogic的JDBC驱动器使用),OracleDelegate(Oracle 8i and 9i使用)。 org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate 在下一步,我们要配置表的前缀: org.quartz.jobStore.tablePrefix = QRTZ_ 最后,我们需要设置用哪个数据源,数据源的名称必须在Quartz属性里定义好。例如,我们可以给Quartz指定使用“myDS”(在配置属性里的其他地方定义好了)作为数据源的名字。 org.quartz.jobStore.dataSource = myDS 如果调度器很繁忙(例如,执行job的个数和线程池的大小一样),那么我们应该设置数据源的连接个数在线程池大小+1之上。 org.quartz.jobStore.useProperties这个属性能够设置为“true”(默认为false),用来指示JDBCJobStore:在JobDataMaps里的所有值都应该是String,这样在能作为name-value方式储存,而不是在BLOB列里以序列化的格式储存复杂的对象。从长远看,这样做会很安全,因为你可以避免将非String的类序列化到BLOB里的类版本问题。
正文到此结束
Loading...