Quartz教程 第9课 JobStore

来源:互联网 发布:mysql连接数据库 编辑:程序博客网 时间:2024/06/05 07:26

9课 JobStore

JobStore负责跟踪传递给scheduler的所有工作数据:jobtriggercalendar等等。为你的Quartz调度器实例选择一个合适的JobStore是很重要的一步。幸运地是,一旦你掌握它们之间的区别,选择是很容易的。你应该在配置文件(quartz.properties)中声明你使用的是哪一个JobStore

注意:从来不要在代码中直接使用JobStore实例。因为某些原因,有许多人想要直接使用它。JobStore是供Quartz自己幕后使用的。你必须通过配置告诉Quartz要使用哪个JobStore,但是在你的代码中你应该只使用Scheduler接口。

9.1 RAMJobStore

RAMJobStore是最简单的JobStore,性能也是更高的(在CPU时间方面)。RAMJobStore人如其名:它将所有数据保存到RAM里。这就是为什么它快如闪电,且易于配置。它的缺点是,当你的应用结束(或者崩溃)时,所有的调度信息都会丢失:这意思是说对于jobtriggerRAMJobStore不具有“非易失性”。对于一些应用来来说这是可以接受的,甚至是希望的行为。但是对于其它一些应用来说,者可能是灾难性的。

要使用RAMJobStore(且假设你使用的是StdSchedulerFactory),只需要在配置Quartz简单的指定JobSotre类属性为类名org.quartz.simpl.RAMJobStore

配置Quartz使用RAMJobStore

org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

你不需要关系其它的设置。

9.2 JDBCJobStore

JDBCJobStore也是恰如其名,它通过JDBC将数据保存到数据库中。因此,它比RAMJobStore更加复杂,也没那么快。然而,性能缺点不是那么可怕,尤其你用主键作为索引构建数据库表。在现代的具有相当好的局域网的机器上,获取和更新trigger的时间不超过10毫秒。

JDBCJobStore几乎可以与任何数据库一起工作,它广泛应用于OraclePostgreSQLMySQLMS SQLServerHSQLDBDB2。要使用JDBCJobStore,你必须首先为Quartz创建数据库表。你可以在Quartz发布包的docs/dbTables目录找到创建数据表的SQL脚本。如果没有你的数据库的脚本,就看看已有的脚本,然后修改一下。要注意的一件事是在这些脚本中,所有数据表都是以“QRTZ_”前缀开头(例如“QRTZ_TRIGGERS”“QRTZ_JOB_DETAIL”)。这个前缀实际可以使任何值,只要你将前缀告诉JDBCJobStore即可(Quartz properties)。使用不同的前缀可以再相同的数据库中为多个scheduler实例创建多个数据库表。

一旦你获取到数据表,在配置和使用JDBCJobStore之前,你还有一个更加重要的决定。你需要确定你的应用使用的事务类型。如果你不需要将调度命名(如增加和删除trigger)绑定到其它的事务上,那么你可以让QuartzJobStoreTX管理事务(这是大部分情况的选择)。

如果你需要Quartz与其它的事务一起工作(即在J2EE应用服务器内),那么你应该使用JobStoreCMT:这种情况下,Quartz会让应用服务器来管理事务。

最后一个问题就是设置DataSourceJDBCJobStore可以从DataSource获取数据库的连接。DataSource可以使用下面的方法在Quartz属性中定义。一种方法时让Quarz自己创建和管理DataSource:提供数据库连接的所有信息。另一种方法就是让Quartz使用由应用服务器管理的DataSource:为JDBCJobStore提供DataSourceJNDI名。关于这些属性的详细信息,请查阅docs/config文件夹下的示例配置文件。

要使用JDBCJobStore(且假设你使用的是StdSchedulerFactory),你首先需要在Quartz配置中设置JobStore类属性的值为org.quartz.impl.jdbcjobstore.JobStoreTXor org.quartz.impl.jdbcjobstore.JobStoreCMT:用哪个值依赖于你的选择。

配置Quartz使用JobStoreTx

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX

接下来,你需要为JobStore选择DriverDelegateDriverDelegate负责所有有关数据库的JDBC工作。StdJDBCDelegate使用普通的SQL语句完成这个工作。如果没有你数据库的代理,你就可以使用这个代理。我们只创建了特定数据库的代理,因为使用StdJDBCDelegate大多数情况下会出问题。其它的代理可以再“org.quartz.impl.jdbcjobstore”包或者子包中找到。其它的代理包括DB2v6Delegate(DB2 6以前版本)HSQLDBDelegate(HSQLDB)MSSQLDelegate(Microsoft SQLServer)PostgreSQLDelegate (PostgreSQL)WeblogicDelegate(使用WeblogicJDBC驱动)OracleDelegate (Oracle)等待。

一旦你选择了代理,就将它的名字设置为JDBCJobStore要使用的代理吧。

配置JDBCJobStore使用DriverDelegate

org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate

接下来,你需要通知JobStore你用的数据表前缀是什么。

配置JDBCJobStore使用的数据表前缀

org.quartz.jobStore.tablePrefix = QRTZ_

最后,你需要设置JobStore应该使用哪一个DataSourceDataSource也必须定义在Quartz属性中。在示例中,我们指定Quartz使用的DataSource名字为myDS(在别处定义的配置属性)

配置JDBCJobStore要使用的DataSource的名字

org.quartz.jobStore.dataSource = myDS

注意:如果你的Scheduler总是处于忙的状态,也就是会所几乎总是执行与线程池大小相等数量的job,那么你应该将DataSource的连接数量设置为线程池大小+2。

“org.quartz.jobStore.useProperties”配置参数可以被设置为true(默认为false),这样可以指导JDBCJobStore, JobDataMaps中的值都是字符串,因此这样可以以名字-值对存储,而不是存储更加复杂的对象(序列化形式BLOB)。从长远来看,这是很安全的,因为避免了将非字符串类序列化为BLOB的类版本问题。

9.3 TerracottaJobStore

TerracottaJobStore提供了可伸缩性和鲁棒性,不需要使用数据库。这意味着你的数据库可以不受Quartz的约束,反而可以保存应用的所有资源。

TerracottaJobStore可以以集群或者非集群方式运行,不管那种情况它都能为为你的job数据提供存储介质。因为数据是保存到Terracotta服务器上的。它的性能比JDBCJobStore好很多(在数量级上更好),但是仍然比RAMJobStore慢。

要使用TerracottaJobStore(且假设你使用的是StdSchedulerFactory),简单的指定org.quartz.jobStore.class = org.terracotta.quartz.TerracottaJobStore作为JobStore类属性,再增加一行配置指定Terracotta服务器的位置:

配置Quartz使用TerracottaJobStore

org.quartz.jobStore.class = org.terracotta.quartz.TerracottaJobStore

org.quartz.jobStore.tcConfigUrl = localhost:9510

关于JobStoreTerracotta的更多信息,请访问http://www.terracotta.org/quartz

 


原创粉丝点击