Quartz高级(企业)功能
Clustering
Clustering目前与JDBC-Jobstore(JobStoreTX或JobStoreCMT)和TerracottaJobStore一起使用。功能包括负载平衡和 job故障转移(如果JobDetail的“请求恢复”标志设置为true)。
使用JobStoreTX或JobStoreCMT进行聚类通过将“org.quartz.jobStore.isClustered”属性设置为“true”来启用Clustering。Clustering中的每个实例都应该使用相同的quartz.properties文件。这样做的例外是使用相同的属性文件,具有以下允许的异常:不同的线程池大小,以及“org.quartz.scheduler.instanceId”属性的不同值。Clustering中的每个节点必须具有唯一的instanceId,通过将“AUTO”作为此属性的值,可以轻松完成(不需要不同的属性文件)。
不要在单独的机器上运行Clustering,除非它们的时钟使用某种形式的时间同步服务(守护进程)进行同步,而这些时间同步服务(守护进程)运行非常有限(时钟必须在彼此之间)。 如果您不熟悉如何执行此操作, 请参阅http://www.boulder.nist.gov/timefreq/service/its.htm。
不要针对任何其他实例运行的相同的一组表来启动非群集实例。您可能会收到严重的数据损坏,一定会遇到不正常的行为。
每次触发只能有一个节点有效。我的意思是,如果job有一个重复的trigger,告诉它每10秒钟发射一次,那么在12:00:00,正好一个节点将运行这个job,在12:00:10,一个节点将运行job等。它不一定是每次相同的节点 - 它或多或少是随机的,哪个节点运行它。负载平衡机制对于繁忙的调度程序(大量的trigger)来说是近乎随机的,但是有利于于non-busy(例如一个或两个trigger)调度程序活动的同一个节点。
使用TerracottaJobStore进行Clustering简单地将调度程序配置为使用TerracottaJobStore(第9课:JobStores中介绍),并且您的调度程序将全部设置为Clustering。
您可能还需要考虑如何设置Terracotta服务器,特别是打开诸如持久性等功能的配置选项,以及运行一系列用于HA的Terracotta服务器。
TerracottaJobStore的企业版提供了高级的Quartz Where功能,允许将作业的智能定位到适当的Clustering节点。
有关此JobStore和Terracotta的更多信息, 请访问http://www.terracotta.org/quartz
JTA事务
如第9课:JobStores所述,JobStoreCMT允许在较大的JTA事务中执行Quartz调度操作。
通过将“org.quartz.scheduler.wrapJobExecutionInUserTransaction”属性设置为“true”,jobs也可以在JTA事务(UserTransaction)内执行。使用此选项集,aa JTA事务将在Job的execute方法被调用之前开始(),并且在执行调用之后commit()终止。这适用于所有jobs。
如果您希望指定每个jobs是否JTA事务应该包装其执行,那么您应该在jobs类上使用 @ExecuteInJTATransaction注释。
除了Quartz自动将Job执行包装到JTA事务中,在Scheduler界面上进行的调用也可以在使用JobStoreCMT时参与事务处理。在调用程序调用方法之前,确保已经启动了一个事务。您可以直接通过使用UserTransaction或将使用调度程序的代码放在使用容器管理事务的SessionBean中来执行此操作。