Clustering :集群
集群目前与JDBC-Jobstore (JobStoreTX或JobStoreCMT)和TerracottaJobStore一起工作。特性包括负载平衡load-balancing和作业故障转移job fail-over(如果JobDetail的“请求恢复”标志被设置为true)。
通过将“org.quartz.jobStore.isClustered”属性设置为“true”,通过JobStoreTX或JobStoreCMT进行集群可以实现集群。集群中的每个实例都应该使用属性文件的相同副本。这方面的例外是使用相同的属性文件,但有以下允许的例外:不同的线程池大小和“instanceId”属性的不同值。集群中的每个节点都必须具有唯一的org.quartz.scheduler.instanceId,通过将“AUTO”作为该属性的值,可以轻松完成(不需要不同的属性文件)。
永远不要在不同的机器上运行群集,除非它们的时钟使用某种形式的时间同步服务(守护进程)进行同步,这些服务定期运行(时钟相差必须在1秒之内)。 如果您不熟悉如何执行此操作,请访问http://www.boulder.nist.gov/timefreq/service/its.htm。
Never fire-up a non-clustered instance against the same set of tables that any other instance is running against. You may get serious data corruption, and will definitely experience erratic behavior.
永远不要针对运行任何其他实例的同一组表启动非群集实例。您可能会遇到严重的数据损坏,并且肯定会遇到不稳定的行为。
每次触发只会触发一个节点。我的意思是,如果Job有一个重复的触发器,告诉它每10秒触发一次,那么在12:00:00正好有一个节点将运行该Job,而在12:00:10正好会有一个节点运行每次都不一定是相同的节点 - 它或多或少是随机的节点运行它。对于繁忙的调度程序(许多触发器),负载平衡机制几乎是随机的,但是对于非繁忙(例如,一个或两个触发器)调度器偏向于 激活的相同节点。
####使用TerracottaJobStore进行集群只需将调度器配置为使用TerracottaJobStore(在 第9课:JobStores中介绍),您的调度器 将全部设置为进行集群。
您可能还需要考虑设置Terracotta服务器带来的影响或者说是作用,特别是启用持久性等特性的配置选项,以及为高可用 运行一组 Terracotta服务器。
TerracottaJobStore企业版提供高级Quartz Where功能,允许将Job智能定位到适当的群集节点。
有关此JobStore和Terracotta的更多信息, 请访问http://www.terracotta.org/quartz
JTA Transactions :JTA事务
如第9课:JobStores中所述,JobStoreCMT允许在更大的JTA事务中执行Quartz调度操作。
通过将“org.quartz.scheduler.wrapJobExecutionInUserTransaction”属性设置为“true”,Job也可以在JTA事务(UserTransaction)中执行。设置此选项后,一个 JTA事务将在调用Job的execute方法之前开始(),并在执行调用终止之后立即执行commit()。这适用于所有Jobs。
如果您想为每个Job指明JTA事务是否应该执行它,那么您应该在作业类上使用 @ExecuteInJTATransaction批注。
除了在JTA事务中自动包装Job执行之外,在使用JobStoreCMT时,在调度器接口上进行的调用也参与事务。在调用调度器上的方法之前,确保已经启动了事务。通过使用UserTransaction,或者将使用调度程序的代码放在使用容器管理事务的SessionBean中,您可以直接实现这一点。