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

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

永远不要在代码中直接使用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毫秒。

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将让应用程序服务器容器管理事务。

最后一个问题是设置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找到。

猜你喜欢

转载自my.oschina.net/icebergxty/blog/1798510