Quartz Tutorial 10 - Advanced (Enterprise) Features
集群
目前JDBC-JobStore
(JobStoreTX
/JobStoreCMT
)和TerracottaJobStore
可以集群式工作。高级功能包括负载均衡和作业的fail-over(这个需要JobDetail
的request recovery标志设置为true
)。
通过设置org.quartz.jobStore.isClustered
属性为true
,JobStoreTX
或JobStoreCMT
就能集群式运行了。对于集群的每个实例,它们应该使用quartz.properties
配置文件的同一份拷贝,这是为了保证一致性,当然有些配置项可以是机器独立的。线程池大小和org.quartz.scheduler.instanceId
属性可以不同。集群的每个节点必须是独立的实例ID,这其实很简单,只需要在这个属性上填写AUTO即可。
集群内节点的时间必须是同步的(从同一个时间同步服务获取时间),此外还应当常规运行同步来保证节点间时间误差不超过1秒
不要针对任何其他实例运行的相同的一组表来启动非群集实例。 不然数据会被严重损坏,而且会出现不正常的行为。
对于每次触发,只有一个节点会执行作业。例如:假定一个触发器设置的是每10秒触发一次,12:00:00的时刻确实有个节点执行作业了,那么12:00:10的时候也确实会有一个节点会执行作业。而且每次也不一定是同一个节点,会随机选择节点来执行作业的。
使用TerracottaJobStore
的集群只需要简单配置一下调度器去使用它即可,然后你的调度器将使用集群全部机器。
您可能还需要考虑如何设置Terracotta服务器,特别是启用一些特别的配置选项,例如在磁盘上存储数据,使用fsync以及运行Terracotta服务器阵列。
关于JobStore
和Terracotta
的更多信息请查看Quartz Scheduler | Terracotta
JTA Transactions
之前在JobStore
一节介绍过,JobStoreCMT
允许Quartz调度操作放在一个大的JTA事务中。
只要设置了org.quartz.scheduler.wrapJobExecutionInUserTransaction
属性为true
,作业也可以在一个JTA事务(UserTransaction
)中执行。这种情况下,一个JTA事务将会在作业的execute
方法调用之前begin()
,在方法执行完毕之后commit()
。
除了Quartz自动将作业的执行包装到JTA事务中,在使用JobStoreCMT
时也可以使用Scheduler
接口参与事务处理。只要保证了你在调度器上调用一个方法前启动了一个事务。还可以更直接点,可以使用UserTransaction
,或将使用调度器的代码放在使用容器管理事务的SessionBean中。