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 |
接下来,你需要设置 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 |
相关推荐
在 "Quartzs -- JDBC-JobStore - Oracle 实现 + Cluster" 的主题中,我们将探讨如何使用 Quartz 配合 JDBC 存储策略和 Oracle 数据库来实现分布式集群环境下的任务调度。 1. **JDBC-JobStore**: Quartz 提供了...
使用 Redis 的 Quartz Scheduler JobStore。quartz-redis-jobstore使用Redis的Quartz Scheduler JobStore 。该项目受到redis-quartz的启发,提供了类似的功能,但有一些关键的区别Redis 数据库和键前缀是可配置的。...
JobStore是Quartz用来存储作业和触发器的地方,它支持多种持久化策略,包括RAMJobStore(内存存储)和各种数据库JobStore实现。 本文主要讲解如何使用Quartz 2.2.0将JobStore配置为持久化到数据库,以及相关的配置...
石英-redis-jobstore 使用 JobStore。 该项目的灵感来自 ,并提供了相似的功能,但有一些主要区别: Redis数据库和密钥前缀是可配置的。 使用Redis。 该库涵盖了该库的所有功能。要求Java 7或更高版本Redis 2.6.12或...
"quartz-elasticsearch-jobstore" 是一个专门为Java平台设计的Quartz作业存储模块,它将Quartz Job的调度信息存储在Elasticsearch中,而非传统的RDBMS(关系型数据库管理系统)。Quartz是一个广泛使用的开源任务调度...
【标题】 DynamoDB上的Quartz Scheduler JobStore实现 在分布式系统中,定时任务调度是必不可少的功能,而Quartz Scheduler是一款广泛使用的开源作业调度框架,它允许开发者定义和调度任务执行。然而,传统的Quartz...
持久的JobStore可以将Job存储到数据库中,而非持久的JobStore将Job存储到内存中。 在Quartz中,开发者需要注意JobDataMap中的内容。因为JobDataMap中的内容将被序列化,所以需要注意类型转换问题。在使用持久的...
# 主要分为scheduler、threadPool、jobStore、dataSource等部分 #============================================================== #Configure Main Scheduler Properties #=====================================...
1. **配置JobStore**:根据需求选择合适的JobStore实现,并配置相关参数,如数据库连接信息。 2. **配置ClusterManager**:设置集群参数,如instanceId、集群节点的数量(numInstances)等。 3. **启动Scheduler**...
- `org.quartz.jobStore.class`: 选择支持集群的Job存储实现,如`org.quartz.impl.jdbcjobstore.JobStoreTX`。 5. **故障转移与负载均衡** - 当一个节点宕机时,其Job和Trigger会被其他存活的节点接管。 - 负载...
NOTE: If "org.quartz.scheduler.batchTriggerAcquisitionMaxCount" is set to > 1, and JDBC JobStore is used, then "org.quartz.jobStore.acquireTriggersWithinLock" must be set to "true" to avoid data ...
2. **数据库配置**: 配置Quartz的JobStore为JDBC-JobStore,并设置正确的数据库连接参数。 3. **公平负载**: 使用Fair-Scheduler插件,确保任务在集群中的各个节点间公平分配。 4. **故障转移**: 当某个节点故障时,...
3. **选择JobStore类型**:设置`quartz.jobStore.type`属性为SQL Server Job Store: ```xml <add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" /> ``` 这里,`JobStoreTX`...
1. **JobStore**:Quartz提供了多种JobStore实现,如RAMJobStore(内存存储)和SQLJobStore(数据库存储)。SQLJobStore是持久化的首选,因为它能在服务器重启后恢复调度信息。 2. **配置文件**:项目可能包含`...
* JobStore:Quartz 设计中包括了一个 JobStore 接口,这样,实现这个接口的 Job 类可以以多种机制实现 Job 的存储 Quartz 的主要功能包括: * 任务调度(Job Scheduling):任务在给定的触发器(Trigger)触发时...
常见的JobStore类型有SQLServerJobStore、OracleJobStore等,它们分别针对不同的数据库系统。配置文件(如`quartz.config`)中应指定连接字符串、表名前缀以及JobStore类型。例如,对于SQL Server: ```xml ...
例如,如果你使用的是JDBCJobStore,你需要在`org.quartz.jobStore.isClustered`属性设置为`true`,开启集群模式,并且在`org.quartz.jobStore.txIsolationLevelName`中指定事务隔离级别,如`READ_COMMITTED`或`...
在配置Quartz时,可以通过`org.quartz.jobStore.class`属性来指定使用的JobStore实现。 博客中可能还会提到Quartz的触发器状态管理,包括PAUSED(暂停)、WAITING(等待)、ACQUIRED(已获取)、COMPLETE(完成)等...
基于JDBC-Jobstore的方式实现集群(有数据库JobStoreTX或JobStoreCMT) 二.TerracottaJobStore的配置(无数据库的集群) 本文介绍的是JDBC-Jobstore基于数据库的集群: 1.目前,群集仅适用于JDBC-Jobstore...
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.MSSQLDelegate org.quartz.jobStore.useProperties=false org.quartz.jobStore.dataSource=myDS org.quartz.jobStore.tablePrefix=QRTZ_ # ...