JobStore

JobStroe 的作用是保存所有你给 scheduler 的“工作数据”:Job、Trigger、Calendar 等等。为你的 Quartz Scheduler 实例选择合适的 JobStore 是很重要的一步。幸运的是,如果你明白了各个 JobStore 之间的不同,那么选择起来将会非常容易。声明使用哪个 JobStore 需要使用到属性文件,这个属性文件可以提供给 SchedulerFactory 用于创建 scheduler 实例。 

不要在你的代码中直接使用 JobStore 对象。基于某些原因,有很多开发者会这么做。JobStore 在 Quartz 中应该是在幕后工作。你需要告诉 Quartz 使用那个 JobStore(通过配置文件),然后在你的代码中只使用 Scheduler 对象。

RAMJobStore

RAMJobStore 是使用上最简单的 JobStore,它也拥有最高的性能(从 CPU 时间来计算)。从 RAMJobStore 的名字来看:它将保存所有数据在 RAM 中。这也是为什么它最轻快并且配置最简单。但是缺点是,当你的应用结束或崩溃,那么所有的 scheduler 数据将会丢失——这意味着,RAMJobStore 不会遵守在 Job 和 Trigger 上的“non-volatility”设置。对有的应用程序来说,这是可接受的(甚至期望如此),但是对另一些应用程序来说,可能是个灾难。要使用 RAMJobStore(假设你正在使用 StdSchedulerFactory),只需简单的在 Quartz 配置文件中设置 JobStore 配置项的值为 org.quartz.simpl.RAMJobStore 即可:

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

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

接下来,你不需要再考虑其它任何配置。

JDBCJobStore

JDBCJobStore 将所有的数据通过 JDBC 保存到数据库中。因此,配置上比 RAMJobStore 稍微复杂一些,它的速度也比较慢。然而,这个性能的落后并不是特别大,尤其是当你在创建数据库表的时候为主键创建了索引的情况下。如果一组机器组建的 LAN(在 scheduler 和数据库之间)条件不错,那么获取并更新触发 Trigger 整个过程一般不会超过 10 毫秒。JDBCJobStore 可以几乎跟任何数据库结合使用,包括 Oracle、 PostgreSQL、 MySQL、 MS SQLServer、 HSQLDB 和 DB2。要使用 JDBCJobStore,你必须先为 Quartz 创建一组数据库表。创建表的脚本在 Quartz 发布包的“docs/dbTables”目录下。如果脚本不适合你所使用的数据库类型,你可以根据需要自己修改脚本。有一点需要注意,在这些脚本中,所有的数据库表都有“QRTZ_”前缀(例如表“QRTZ_TRIGGERS”和“QRTZ_JOB_DETAIL”)。实际上,你可以使用你喜欢的任意前缀,只需要在 Quartz 属性文件中告诉 JDBCJobStroe 使用哪个前缀即可。如果你需要在同一个数据库中为多个 scheduler 实例使用不同的数据库表保存数据,那么使用不同的前缀将会非常有用。

一旦数据库表创建好,在使用 JDBCJobStore 之前,还需要做一个决定。你需要决定你的应用程序要使用哪种类型的事务机制。如果你不需要绑定你的 scheduler 命令(例如增加和删除 Trigger)到其它的事务,那么 JosStore 可以通过 JobStoreTX 管理事务(这也是最常用的选择)。

如果你需要 Quzrtz 协同其它事务一起工作(例如,在 Java EE 应用服务器中),那么你需要使用 JobStoreCMT——这样,Quartz 将会让应用程序服务器来管理事务。

最后一点是如何创建 DataSource,好让 JDBCJobStore 从你的数据库中获取连接。.DataSource 在 Quartz 属性文件中,有几种不同的配置方法。一种方式是让 Quartz 自己创建并管理 DataSource —— 这需要提供数据库的所有连接信息。另一种方式是让 Quartz 使用应用程序服务器提供的 DataSource —— 提供给 JobStore DataSource 的 JNDI 名称。详细的配置可以参考“docs/config” 目录下的配置文件。

要使用 JDBCJobStore(假设你正在使用 StdSchedulerFactory),首先需要设置 Quartz 配置项,让 JobStore 类的属性是 org.quartz.impl.jdbcjobstore.JobStoreTX 或 org.quartz.impl.jdbcjobstore.JobStoreCMT —— 具体选择哪个值取决于上面的描述。

配置 Quartz 使用 org.quartz.impl.jdbcjobstore.JobStoreTX:

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

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

扫描二维码关注公众号,回复: 277159 查看本文章

接下来,你需要设置 JogStore 使用的 DriverDelegate。DriverDelegate 的作用是为特定的数据库执行 JDBC 的工作。StdJDBCDelegate 使用标准 JDBC 代码(和 SQL 语句)来做这个工作,如果没有其它合适的 delegate 适用于你的数据库,那么你可以试试使用 StdJDBCDelegate。其它的 delegate 可以在 “org.quartz.impl.jdbcjobstore” 包,或者在它的子包中找到。其它 delegate 包括  DB2v6Delegate (DB2 版本 6 或早期版本)、 HSQLDBDelegate (HSQLDB)、MSSQLDelegate(Microsoft SQLServer)、PostgreSQLDelegate (PostgreSQL)、WeblogicDelegate(使用 Weblogic 创建的 JDBC 驱动)、 OracleDelegate (Oracle)、等等。

一旦选择好使用哪个 delegate,那么就可以在属性文件中设置它的类名。

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

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

接下来,需要配置 JobStore 使用的数据库表前缀(前面讨论过):

org.quartz.jobStore.tablePrefix = QRTZ_

org . quartz . jobStore . tablePrefix = QRTZ_

最后,你需要设置使用哪个 DataSource。DataSource 名必须定义到 Quartz 属性文件中。在下面的例子中我们使用“myDS”作为 DataSource 名:

org.quartz.jobStore.dataSource = myDS

org . quartz . jobStore . dataSource = myDS

如果你的 Scheduler 很繁忙(例如,执行的任务数和线程池的大小总是差不多),那么你可能要设置 DataSource 中的连接数是线程池中的大小 + 2。

可以设置 org.quartz.jobStore.useProperties 属性值为 true(默认是 false),目的是为了让 JDBCJobStore 中的 JobDataMap 中的所有值都是 String 类型,这样方便存储键值对,而不是使用序列化的方式将复杂的对象存储到 BLOB 字段中。在长期看来,这将会更安全,因为你避免了类的版本的问题。

TerracottaJobStore

TerracottaJobStore 提供了一种不使用数据库,并且灵活的和健壮的手段。这意味着你的数据库可以不用加载任何 Quartz 的数据,这样可以为你的应用程序节省更多的数据库资源。

TerracottaJobStore 可以在集群或非集群的环境下使用,无论哪种环境都会在应用程序重启的时候为 Job 数据提供储存介质。这些数据是存储在 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

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

org . quartz . jobStore . tcConfigUrl = localhost : 9510

猜你喜欢

转载自u011820505.iteye.com/blog/2363232