专栏首页Throwable's Blog第十一章:高级(企业级)特性

第十一章:高级(企业级)特性

集群

Quartz集群目前与JDBC-Jobstore(JobStoreTXJobStoreCMT)和(<–译者注:其实我觉得这里应该是"或")TerracottaJobStore一起使用。功能包括负载均衡和Job故障转移(如果JobDetail的“请求恢复(request recovery)”标志设置为true)。

使用JobStoreTX或JobStoreCMT通过将org.quartz.jobStore.isClustered属性设置为true来启用集群模式。**集群中的每个实例都应该使用相同的quartz.properties文件。**这些相同的配置文件中,也允许下面几项属性配置是可以不相同的:不同的线程池大小,以及org.quartz.scheduler.instanceId设置不同的属性值。集群中的每个节点必须具有唯一的instanceId,通过将AUTO作为此属性的值,可以轻松完成此定义(这样就不需要使用不同的配置文件)。下面是注意事项:

不要在各自独立的机器上各自开启集群模式,除非它们的时钟使用某种形式的时间同步服务(守护进程)进行同步,而这些时间同步服务(守护进程)运行得非常有规律(各个机器的时钟差距必须在一秒内)。 如果你不熟悉如何执行此操作, 请参阅`http://www.boulder.nist.gov/timefreq/service/its.htm`。
非集群模式下,两个不同的实例千万不要使用同一套Quartz的表。否则,你一定会遇到不正常的(调度)行为,有可能会遭遇严重的数据损坏。

集群中触发机制是:Job每次只能被一个节点触发(也就是虽然集群中每台机器都跑着Quartz的调度器,但是Job需要被触发的时刻只有一台机器会进行触发)。我的意思是,如果Job有一个重复的Trigger,告诉它每10秒钟触发一次,那么在12:00:00,正好一个节点将执行这个Job,在12:00:10,也是由一个节点将执行此Job等。并不一定是每次由相同的节点执行Job - 由哪个节点执行它是随机的。负载均衡机制对于繁忙的调度程序(大量的Trigger)来说是近乎随机的。但是对于非繁忙(只有一两个Trigger)的调度器集群来说,有可能偏向于由同一个节点执行。(译者注:其实从源码上看,主要是看哪个节点先获取到独占锁。)

使用TerracottaJobStore建立Quartz集群只需要将把Scheduler的JobStore配置为TerracottaJobStore(第九章:JobStores中介绍过)即可,然后你的调度器就会被设置为集群模式。

您可能还需要考虑如何设置Terracotta服务器,特别是开启持久化特性等功能的配置选项,以及搭建一些列高可用的Terracotta服务器。

TerracottaJobStore的企业版提供了高级的"Quartz Where"功能,允许将作业的智能定位到适当的Quartz集群节点。

有关JobStore和Terracotta的更多信息,请访问http://www.terracotta.org/quartz

JTA事务

正如第九章:JobStores所述,JobStoreCMT允许在较大的JTA事务中执行Quartz调度操作。

通过将org.quartz.scheduler.wrapJobExecutionInUserTransaction属性设置为true,Job也可以在JTA事务(UserTransaction)内执行。使用此选项集,一个JTA事务将在Job的execute方法被调用之前调用其begin()方法,并且在Job执行完成调用之后调用其commit()。这适用于所有的Job。

如果你希望指定每个Jobs是否包裹在JTA事务内执行,那么你应该在Job类上使用@ExecuteInJTATransaction注解。

除了Quartz自动将Job执行包装到JTA事务中,使用JobStoreCMT之后在Scheduler接口方法也可以使用事务处理。你可以明确一点:在使用Scheduler接口方法之前已经开启了一个事务。你可以直接通过使用UserTransaction或将使用调度程序的代码放在使用容器管理事务的SessionBean中来执行此操作。

原文链接:tutorial-lesson-11

本文是Throwable的原创文章,转载请提前告知作者并且标明出处。 博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议 本文永久链接是:https://www.throwable.club/2019/03/30/quartz-doc-translation-lesson-11/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 第十二章:其他特性

    Quartz提供了一个用于插入附加功能的接口org.quartz.spi.SchedulerPlugin。

    Throwable
  • 深入分析Java反射(一)-核心类库和方法

    Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以...

    Throwable
  • 第七章:Trigger监听器和Job监听器

    监听器(listener)是你创建的对象,主要作用是接收和处理调度器回调的事件(event)。TriggerListener接收到与触发器(Trigger)相关...

    Throwable
  • Portworx演示:在K8S集群间迁移有状态的应用和数据

    越来越多的企业选择Kubernetes作为基础架构,它能够帮助我们缩短软件项目上市时间、降低基础架构成本、并提高软件质量。由于Kubernetes比较新,因此I...

    Portworx
  • java反射机制简单介绍

    gfu
  • Python基础知识

    print 打印语句 # 注释语句 print语句中带有变量可以把变量和字符串使用,隔开或者使用+进行连接 逗号会用空格分开两个变量,+会把两个变量作为一...

    苦咖啡
  • Springboot 系列(三)Spring Boot 自动配置

    关于配置文件可以配置的内容,在 Spring Boot 官方网站已经提供了完整了配置示例和解释。

    未读代码
  • JavaScript函数及其prototype

    函数可以通过声明定义,也可以是一个表达式。 (1)函数声明式: 分号是用来分隔可执行JavaScript语句,由于函数声明不是一个可执行语句,所以不以分...

    奋飛
  • Spring、SpringMVC、SpringBoot之间的关系

    随着微服务架构的兴起,SpringBoot映入眼帘,今天我们来说下三者的含义以及关系。

    别明天就今天吧
  • [android] 天气app布局练习(二)

    陶士涵

扫码关注云+社区

领取腾讯云代金券