Clustering
集群特性主要存在于JDBC-Jobstore和TerracottaJobStore。集群特性包括负载均衡和重试。
通过将“org.quartz.jobStore.isClustered”设置为true,可以开启JobStoreTX和JobStoreCMT的集群模式。集群中的所有实例应该共享同一个配置文件。实例自身的配置应该独立于这个配置文件,这些配置包括:线程池的线程数、org.quartz.scheduler.instanceId属性值等等。集群中的实例必须有唯一的实例ID,简单起见,直接将org.quartz.scheduler.instanceId这个设为AUTO就好了。
注:
- 绝不要在多个机器上运行集群模式,除非这些机器使用某个绝对稳定的时间同步服务同步其时间(误差在1秒以内)。更多的参见http://www.boulder.nist.gov/timefreq/service/its.htm。
- 非集群的实例之间绝对不要共享数据库表,这样会带来不可预知的问题。
每个任务只会跑在一个实例上。对于重复执行的任务,每次执行都在一个实例上,但是前后的任务会随机跑在实例中。负载均衡的算法就负责如何分配任务到不同的实例,例如那些不太忙的实例,就会多分一些任务给它们。
将Scheduler的JobStore配置为TerracottaJobStore,即可开启TerracottaJobStore的集群模式。企业级的Terracotta版本提供了实例节点选择的更智能化的特性,至于如何搭建Terracotta服务器,特别是用到它的一些特性,例如持久化、HA高可用等等,可以参见:http://www.terracotta.org/quartz
JTA Transactions
正如 Lesson 9: JobStores介绍的,利用JobStoreCMT,Quartz可以支持大规模的分布式事务调度。
将“org.quartz.scheduler.wrapJobExecutionInUserTransaction” 属性设为 “true”,即可开启分布式,设置分布式属性之后,对于所有的任务,在执行之前开始都将打开JTA事务,在execute结束之前提交。
如果想针对单个任务开启分布式特性,在类中加上注解@ExecuteInJTATransaction即可。
Quartz中除了任务的执行使用JTA分布式事务自动的封装外,对Scheduler的调用也使用JobStoreCMT提供了事务的特性。确保执行任务时使用事务,是很明智的。做到这一点,可以直接使用UserTransaction,或者将代码放到使用事务容器管理的SessionBean中即可。