(翻译)Quartz官方教程——第九课:Job Stores

JobStore是用来跟踪你加到调度器中的全部“工做数据”:任务、触发器、日历等等。因此为你的Quartz调度实例选取合适的JobStore是很是重要的。幸运的是,当你理解了不一样JobStore的特色之后这个选择会变得很是容易。您能够在您提供给SchedulerFactory的属性文件(或对象)中声明您的调度程序应使用哪一个JobStore(以及它的配置设置),以便用于生成调度程序实例。java

永远不要在代码中直接使用JobStore实例。许多用户会由于各类缘由这么作。JobStore仅限于Quartz自己的内部使用。你必须告诉Quartz(经过配置)使用哪一个JobStore,可是你应该只使用代码中的Scheduler接口。数据库

 RAMJobStore

RAMJobStore是最简单易用的一种JobStore,并且拥有最高的性能(在CPU运行时间方面)。RAMJobStore的运行方式就像他的名字同样:它把全部数据存储在内存中。这就是为何它快如闪电,以及配置如此简单的缘由。缺点是当你的应用程序结束(或崩溃)时,全部的调度信息都会丢失——这意味着RAMJobStore不能实现任务和触发器的持久化。对于某些应用来讲,这是能够接受的——甚至是必须的,但对于另一些应用来讲,这将是灾难性的。安全

要使用RAMJobStore(并假设您使用的是StdSchedulerFactory),只需将类名称org.quartz.simpl.RAMJobStore指定为用于配置quartz的JobStore类属性便可:服务器

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

除此以外没有其余东西须要配置了。性能

JDBCJobStore

JDBCJobStore的功能一样如其名——它经过JDBC把全部的数据存储到数据库。所以,它的配置比RAMJobStore稍微复杂一些,并且速度也不尽如人意。可是,它的性能也不是特别差,尤为是你使用主键上的索引构建数据库表时。在具备至关现代LAN的机器上(在调度器和数据库之间),检索和更新触发器的时间一般小于10毫秒。spa

JDBCJobStore几乎能够运行在任何数据库上,它已普遍用于Oracle,PostgreSQL,MySQL,MS SQLServer,HSQLDB和DB2。为了使用JDBCJobStore,你必须首先建立一系列的表供Quartz使用。您能够在Quartz发行版的“docs / dbTables”目录中找到建立表的SQL脚本。若是您的数据库类型没有脚本,只需查看其中一个现有脚本,而后进行修改以适配您的数据库类型便可。须要注意的是,全部的表名均之前缀“QRTZ_”开头(好比表“QRTZ_TRIGGERS”和“QRTZ_JOB_DETAIL”)。这个前缀实际上能够是任何你想要的,只要你告诉JDBCJobStore前缀是什么(在你的Quartz配置文件中)。使用不一样的前缀对于在同一数据库中为多个调度程序实例建立多组表,是颇有用的。线程

建立了这些表以后,在配置和启动JDBCJobStore以前,您还须要作出更多重要的选择。您须要肯定应用程序须要什么类型的事务。若是您不须要将调度命令(如添加和删除触发器)与其余事务绑定在一块儿,那么您可让Quartz使用JobStoreTX做为JobStore来管理事务(大多数状况下都如此)。代理

若是您须要Quartz与其余事务(即在J2EE应用程序服务器中)一块儿工做,那么您应该使用JobStoreCMT--在这种状况下,Quartz将让应用程序服务器容器管理事务。code

最后一个问题是设置JDBCJobStore的DataSource使它能够链接到数据库。你可使用几种不一样的方式在Quartz配置文件中定义DataSource。一种方法是让Quartz建立和管理数据源自己 - 经过提供数据库的全部链接信息。另外一种是由应用程序服务器管理DataSource,让Quartz使用——经过向JDBCJobStore提供DataSource的JNDI名称。有关这些属性的详细信息,请参阅“docs / config”文件夹中的示例配置文件。对象

要使用JDBCJobStore(并假设您使用的是StdSchedulerFactory),首先须要将Quartz配置的JobStore类属性设置为org.quartz.impl.jdbcjobstore.JobStoreTX或org.quartz.impl.jdbcjobstore.JobStoreCMT——取决于您根据上述几段中的解释所作的选择。

配置Quartz使用JobStoreTx

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

接下来,您须要选择JobStore使用的DriverDelegate。DriverDelegate负责执行您的特定数据库可能须要的任何JDBC工做。StdJDBCDelegate是一个使用“vanilla”JDBC代码(和SQL语句)来完成工做的委托。若是没有专门为您的数据库建立的另外一个委托,请尝试使用此委托 - 咱们仅为使用StdJDBCDelegate(这彷佛是最多的!)发现问题的数据库建立数据库特定的委托。其余委托能够在“org.quartz.impl.jdbcjobstore”包或其子包中找到。其余委托包括DB2v6Delegate(应用于DB2第六版及以前版本),HSQLDBDelegate(用于HSQLDB),MSSQLDelegate(用于微软的SQLServer),PostgreSQLDelegate(用于PostgreSQL),WeblogicDelegate(用于使用由Weblogic制做的JDBC驱动程序),OracleDelegate(用于Oracle)等等。

选择代理后,将其类名设置为JDBCJobStore的代理以使用。

配置JDBCJobStore以使用DriverDelegate:

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

接下来,您须要告诉JobStore您使用的是什么表前缀(正如上面讨论的)。

org.quartz.jobStore.tablePrefix = QRTZ_

最后,您须要设置JobStore应该使用哪一个DataSource。指定的数据源也必须在你的Quartz配置文件中定义。在这种状况下,咱们指定Quartz应该使用DataSource名称“myDS”(在配置文件中的其余位置定义)。

org.quartz.jobStore.dataSource = myDS

若是您的调度程序老是繁忙(即几乎老是执行与线程池大小相同的做业数量),那么您应该将DataSource中的链接数设置为线程池大小+2左右。

能够将“org.quartz.jobStore.useProperties”配置参数设置为“true”(默认为false),以便指示JDBCJobStore JobDataMaps中的全部值都是字符串,而后其能够以键值对的方式存储,而不是做为一个复杂对象序列化后存入BLOB字段。从长远来看,这更安全,由于您能够避免将非String类序列化为BLOB时出现的类版本问题。

 TerracottaJobStore

TerracottaJobStore在不使用数据库的状况下提供了扩展性和健壮性。这意味着你的数据库将再也不须要负担Quartz的压力,并且能够将其全部资源保存到其余应用程序中。

TerracottaJobStore能够运行集群或非集群,而且不管是哪一种状况,都会为您的做业数据提供存储,这些数据在应用程序从新启动之间持续存在,由于数据存储在Terracotta服务器中。它的性能比经过JDBCJobStore使用数据库要好得多(大约好一个数量级),但比RAMJobStore慢得多。

要使用TerracottaJobStore(并假设您使用的是StdSchedulerFactory),只需配置org.quartz.jobStore.class = org.terracotta.quartz.TerracottaJobStore,而后额外添加一行指定Terracotta服务器的位置:

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

关于JobStore和Terracotta的更多信息能够在http://www.terracotta.org/quartz找到。

相关文章
相关标签/搜索