Quartz Tutorial 10 - Advanced (Enterprise) Features

Quartz Tutorial 10 - Advanced (Enterprise) Features

Quartz Tutorial 10 - Advanced (Enterprise) Features

集群

目前JDBC-JobStoreJobStoreTX/JobStoreCMT)和TerracottaJobStore可以集群式工作。高级功能包括负载均衡和作业的fail-over(这个需要JobDetail的request recovery标志设置为true)。

通过设置org.quartz.jobStore.isClustered属性为trueJobStoreTXJobStoreCMT就能集群式运行了。对于集群的每个实例,它们应该使用quartz.properties配置文件的同一份拷贝,这是为了保证一致性,当然有些配置项可以是机器独立的。线程池大小和org.quartz.scheduler.instanceId属性可以不同。集群的每个节点必须是独立的实例ID,这其实很简单,只需要在这个属性上填写AUTO即可。

集群内节点的时间必须是同步的(从同一个时间同步服务获取时间),此外还应当常规运行同步来保证节点间时间误差不超过1秒

不要针对任何其他实例运行的相同的一组表来启动非群集实例。 不然数据会被严重损坏,而且会出现不正常的行为。

对于每次触发,只有一个节点会执行作业。例如:假定一个触发器设置的是每10秒触发一次,12:00:00的时刻确实有个节点执行作业了,那么12:00:10的时候也确实会有一个节点会执行作业。而且每次也不一定是同一个节点,会随机选择节点来执行作业的。

使用TerracottaJobStore的集群只需要简单配置一下调度器去使用它即可,然后你的调度器将使用集群全部机器。

您可能还需要考虑如何设置Terracotta服务器,特别是启用一些特别的配置选项,例如在磁盘上存储数据,使用fsync以及运行Terracotta服务器阵列。

关于JobStoreTerracotta的更多信息请查看Quartz Scheduler | Terracotta

JTA Transactions

之前在JobStore一节介绍过,JobStoreCMT允许Quartz调度操作放在一个大的JTA事务中。

只要设置了org.quartz.scheduler.wrapJobExecutionInUserTransaction属性为true,作业也可以在一个JTA事务(UserTransaction)中执行。这种情况下,一个JTA事务将会在作业的execute方法调用之前begin(),在方法执行完毕之后commit()

除了Quartz自动将作业的执行包装到JTA事务中,在使用JobStoreCMT时也可以使用Scheduler接口参与事务处理。只要保证了你在调度器上调用一个方法前启动了一个事务。还可以更直接点,可以使用UserTransaction,或将使用调度器的代码放在使用容器管理事务的SessionBean中。