# 高级(企业)功能

# 集群【Clustering】

集群目前使用JDBCJobStoreJobStoreTXJobStoreCMT)和TerracottJobStore。功能包括负载平衡和作业故障转移(如果JobDetail的“请求恢复”标志设置为true)。

通过将“org.quartz.jobStore.isClustered”属性设置为“true”来启用JobStoreTXJobStoreCMT群集。集群中的每个实例都应该使用相同的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交流群
原创网站开发,偏差难以避免。

如若发现错误,诚心感谢反馈。

愿你倾心相念,愿你学有所成。

愿你朝华相顾,愿你前程似锦。