# 高级(企业)功能
# 集群【Clustering】
集群目前使用JDBCJobStore
(JobStoreTX
或JobStoreCMT
)和TerracottJobStore
。功能包括负载平衡和作业故障转移(如果JobDetail
的“请求恢复”标志设置为true)。
通过将“org.quartz.jobStore.isClustered”属性设置为“true”来启用JobStoreTX
或JobStoreCMT
群集。集群中的每个实例都应该使用相同的quartz.properties
副本文件。例外情况是使用相同的属性文件,但允许的例外情况如下:不同的线程池大小,以及org.quartz.schedur.instanceId
属性的不同值。集群中的每个节点都必须有一个唯一的实例ID,通过将AUTO
作为该属性的值,这一点很容易实现(不需要不同的属性文件)。
不要在单独的机器上运行集群,除非它们的时钟使用某种形式的时间同步服务(守护进程)进行同步,这种服务非常有规律地运行(时钟必须在一秒钟之内)。如果你不熟悉怎么做,参考(http://www.boulder.nist.gov/timefreq/service/its.htm)[http://www.boulder.nist.gov/timefreq/service/its.htm]。
永远不要针对任何其他实例正在运行的同一组表启动非集群实例。这可能会导致严重的数据损坏,并且肯定会经历不稳定的行为。
每次作业触发只有一个节点被触发。意思是,如果作业有一个重复触发器,告诉它每10秒启动一次,那么在12:00:00时,正好有一个节点将运行该作业,而在12:00:10时,正好一个节点会运行该作业等。它不一定每次都是同一个节点——运行它的节点或多或少是随机的。负载平衡机制对于忙调度器(很多触发器)几乎是随机的,但对于非忙调度器(例如,一个或两个触发器),它支持刚刚处于活动状态的同一节点。
使用TerracottJobStore
集群只需将调度器配置为使用TerracottaJobStore
(在第9课:作业存储中介绍),您的调度器将全部设置为集群。
您可能还需要考虑如何设置Terracotta
服务器的含义,特别是启用持久性等功能的配置选项,以及为HA运行一系列Terracotta
服务。
# JTA事务
如第9课:作业存储中所述,JobStoreCMT
允许在较大的JTA事务中执行Quartz调度操作。
通过将org.quartz.schedur.wrapJobExecutionInUserTransaction
属性设置为“true”,作业也可以在JTA事务(UserTransaction
)中执行。设置此选项后,JTA事务将在调用作业的execute()
方法之前调用begin()
方法,而commit()
方法将在执行调用终止之后开始。这适用于所有作业。
如果您希望为每个作业指示JTA事务是否应包装其执行,则应在作业类上使用@ExecuteInJTATransaction
注解。
除了Quartz在JTA事务中自动包装作业执行外,在使用JobStoreCMT
时,在调度器接口上进行的调用也会参与事务。只需确保在调用调度程序上的方法之前已启动事务。您可以通过使用UserTransaction
直接执行此操作,也可以将使用调度器的代码放在使用容器管理事务的SessionBean
中。

微信公众号

QQ交流群
如若发现错误,诚心感谢反馈。
愿你倾心相念,愿你学有所成。
愿你朝华相顾,愿你前程似锦。