您的位置:首页 > 编程语言 > Java开发

[译]Java定时任务调度-Quartz文档(九)Job Stores

2017-03-31 11:31 489 查看
JobStore主要是追踪调度过程中所有的数据,包括jobs、triggers、calendars等等。为Quartz Scheduler选择合适的JobStore是很重要的。幸运的是,一旦了解了JobStore的区别,这是一件很简单的事。一般在SchedulerFactory的配置文件中指定JobStore。

注意:由于某些原因,某些人尝试在代码中直接使用JobStore,但请注意,永远不要。仅仅需要告知Quartz使用哪个JobStore,接下来在代码中仅仅使用Scheduler接口就好了。

RAMJobStore

RAMJobStore用起来最方便。从CPU的角度来说,也是最有效率的。从名字就可以看出,它将所有数据存在RAM中。这也是为什么它如此轻快、配置简单的原因。 缺点在于一旦项目中的所有调度任务结束,RAMJobStore中存储的信息都会丢失,无法持久化地存储下来。对于某些项目,这个特性是可以接受甚至乐意接受的,但是对于另一些项目来说,这点是不可接受的。

使用RAMJobStore只需要配置如下即可:

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


其余的啥也不用干。

JDBCJobStore

JDBCJobStore顾名思义就是将所有数据通过JDBC存起来。因为要稍微的复杂一点,所以效率要稍微差一点,但是也不会差太多,特别是当数据库有主键索引的时候。在通用的带LAN的电脑上,更新一个启动的trigger耗时少于10毫秒。

JDBCJobStore几乎支持所有的数据库,包括Oracle, PostgreSQL, MySQL, MS SQLServer, HSQLDB, 和 DB2。使用JDBCJobStore, 必须先创建一些供Quartz使用的数据表。创建sql语句的脚本可以在docs/dbTables目录找到。如果没有适合你的数据库类型的脚本,直接找一个其他的,按预发改改就好了。仅需要注意一点,所有表都必须以“QRTZ_”开头。如果为JDBCJobStore指定前缀,这里可以随便写。创建不同的前缀可以用于创建多个数据表集合、用于在一个数据库中使用多个Scheduler。

一旦数据库表创建,需要决定一件事:使用何种事务。如果不需要将调度指令绑定到其他事务,可以让Quartz通过JobStoreTX来管理事务。

如果需要Quartz和其他事务一起工作,应该使用JobStoreJMT,这样Quartz就会将事务的管理权移交给其他的app server容器。

最后一点需要设置的是为JDBCJobStore建链指定一个数据源。数据源定义在Quartz的properties文件中,有多重方式。一种方式是让Quartz自己创建管理数据源(通过提供连接数据库的所有信息),另一种是使用Quartz所运行的应用服务器来管理(通过向JDBCJobStore提供数据源的JNDI名)。更多的细节请查看docs/config文件夹。

使用JDBCJobStore时,先要根据以上所说

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


接下来需要指定JobStore使用的驱动代理。驱动代理是处理数据库相关的JDBC相关工作。

StdJDBCDelegate使用“vanilla” JDBC代码(and SQL 语句) .如果没有特定需求,用这个代理即可。 这个代理兼容性最好,用的也是最多的。 其他驱动代理在org.quartz.impl.jdbcjobstore及其子包中可以找到,包括DB2v6Delegate (for DB2 version 6 and earlier), HSQLDBDelegate (for HSQLDB), MSSQLDelegate (for Microsoft SQLServer), PostgreSQLDelegate (for PostgreSQL), WeblogicDelegate (for using JDBC drivers made by Weblogic), OracleDelegate (for using Oracle)等等.

一旦选定了驱动代理,把它设置到JDBCJobStore中。

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


接下来需要指定表名前缀:

org.quartz.jobStore.tablePrefix = QRTZ_


最后需要设置JobStore使用的数据源,定义在Quartz的properties中,这里给出的例子中使用的是myDS。

org.quartz.jobStore.dataSource = myDS


注:1. 如果配置的任务比较多(换句话说,几乎每时每刻都是满线程池的跑任务)那么最好将数据源中的连接数设置为线程数+2;

org.quartz.jobStore.useProperties这个参数可以设置为true,即表示所有JobDataMaps中的值都以String的形式存储,这样就可以使用name-value的形式存储,而避免使用复杂的格式存储(例如BLOB)。这样会更安全,避免了版本和序列化等问题。

TerracottaJobStore

TerracottaJobStore提供了一种脱离数据库的可扩展、健壮的方式。这样Quartz完全不用使用数据库,而将更好的服务其他业务。

TerracottaJobStore可以以集群/非集群的模式运行。每种模式都提供了存储数据的功能。这种方式的性能明显优于JDBCJobStore,但是略逊色于RAMJobStore。

TerracottaJobStore的使用也很简单,指定JobStore的class,再加上一行,指定Terracotta server:

org.quartz.jobStore.class = org.terracotta.quartz.TerracottaJobStore
org.quartz.jobStore.tcConfigUrl = localhost:9510


更多的信息参见http://www.terracotta.org/quartz
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐