codecamp

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中来执行此操作。

配置,资源使用和SchedulerFactory
Quartz其他功能
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }