原文地址:http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/tutorial-lesson-11
使用JDBC-JobStore(JobStoreTx或JobStoreCMT)和TerracottaJobStore可以集群并发工作。特性包含负载均衡和作业任务故障切换(当JobDetails的“请求恢复”标记设置为true)。
设置“org.quartz.jobStore.isClustered”参数为true可以开启集群功能。集群中的每个实例都应该使用相同的quartz.properties文件。使用相同的属性文件后可以有不同的属性,下面的几条允许例外:不同的线程池大小,“org.quartz.scheduler.instanceId”属性值可以不相同。集群的每一个节点必须有独一无二的instanceId,把该属性值设置为“AUTO”就可以很容易达到这个要求。(不需要不同的属性文件)
不要在不同的计算机上运行Quartz集群,除非它们的时钟是使用时间同步服务(后台服务)同步过的,运行非常有规律(每台计算机的时间误差在1秒内)。如果你不熟悉怎么同步可以看这里:http://www.boulder.nist.gov/timefreq/service/its.htm。
不要在集群中任何节点运行的一套表中存在非集群实例的运行。你可能会导致严重的数据问题,并且肯定会遇到不稳定的行为。
每次只会有一个节点的作业任务被触发。我的意思是,如果一个作业任务有重复的触发器显示每10秒触发一次,然后在12:00:00准点时集群中的一个节点会执行作业任务,在12:00:10时也是一个节点执行作业任务。它不一定每次都是同一个节点——它或多或少会随机选择一个节点去执行。负载均衡机制是就近随机的忙碌调度(大量的触发器)而倾向于选取活跃而不繁忙调度(例如只有一两个触发器)的节点。
使用TerracottaJobStore简单地配置调度器(在第九课:JobStores讲过),你的调度器将全部设置为集群。
你可能还需要考虑如何设置您的Terracotta服务器的影响,尤其是打开功能的配置选项如持久化,运行Terracotta服务器的高可用性集群。
企业版本的TerracottaJobStore提供高级Quartz功能,即允许作业任务智能定位到合适的集群节点上。
更多关于JobStore和Terracotta的信息可以参照:http://www.terracotta.org/quartz。
从第九课:JobStores介绍可知,JobStoreCMT允许Quartz调度操作在大型JTA事务中执行。
当"org.quartz.scheduler.wrapJobExecutionInUserTransaction"属性设置为true时,作业任务也可以在一个JTA事务(用户事务)中执行。使用此选项设置,JTA事务将在作业任务execute方法调用前开始,并且execute结束之后立即提交。这适用于所有作业任务。
如果你想标明每个作业任务的执行是否嵌套一个JTA事务,你可以在job类中使用注解@ExecuteInJTATransaction。
除了Quartz自动地将作业任务执行嵌套进JTA事务,当你的调度器接口使用JobStoreCMT时,也可以加入事务。只是要确保你在调度器调用方法前要启动一个事务。你可以通过使用UserTransaction直接执行此操作,或者把你的代码放到有管理事务容器的SessionBean中的调度器里。