第11课 高级(企业级)特性
11.1 集群
当前的集群需要和JDBCJobstore (JobStoreTX或JobStoreCMT)和TerracottaJobStore一起工作。这个特定包括负载均衡和job容错(如果JobDetail的“请求恢复”标志设置为true的话)。
####使能JobStoreTX或JobStoreCMT的集群,需要将“org.quartz.jobStore.isClustered”属性设置为true。集群中的一个scheduler实例都要使用同一份quartz.properties文件。完全相同的属性文件,可以允许下面的例外:不同的线程池大小,不同的“org.quartz.scheduler.instanceId”属性值。集群中的每一个节点必须具有唯一的instanceId,这很容易实现(不需要不同的属性文件),只需要将这个属性的值设置为AUTO即可。
注意:从来不要在分离的机器上运行集群,除非它们的时钟是同步的,使用一些时间同步服务(守护进程)且运行非常规律(the clocks must be within a second of each other)。如果不知道如何实现,请参见http://www.boulder.nist.gov/timefreq/service/its.htm。
从来不要在经被其它实例运行的相同数据表上触发非集群实例。这可能会发生严重数据错误,一定会出现不稳定的行为。
每一次触发,都只有一个节点会触发job。我说的意思是,如果job有一个重复trigger,告诉它每10s触发一次,那么在12:00:00只有一个节点会运行这个job,在12:00:10也只有一个节点会运行这个job,等等。每一次不必是同一个节点:它在哪个节点上运行是随机的。对于忙碌的scheduler(有许多trigger)来说,负载均衡机制几乎是随机的,但是对于不忙碌的scheduler来说,更喜欢用相同的处于active的节点。
####使用TerracottaJobStore的集群,简单配置scheduler使用TerracottaJobStore(第9课 JobStore介绍了),你的scheduler都是用于集群的。
你也想要考虑如何设置Terracotta服务器,尤其是打开特性的配置选项,例如持久化,运行一组Terracotta服务器以实现HA。
TerracottaJobStore的企业级版本提供了高级的Quartz Where特性,它允许智能的将job定向到合适的集群节点上。
关于JobStore和Terracotta的更多信息,请访问http://www.terracotta.org/quartz
11.2 JTA事务
如第9课 JobStore介绍的,JobStoreCMT允许Quartz在更大的JTA事务中执行调度操作。
Jobs要想在JTA事务中执行(UserTransaction),要将属性“org.quartz.scheduler.wrapJobExecutionInUserTransaction”设置为true。如果设置了这个属性,在调用Job的execute方法之前,JTA事务会调用begin()方法,在execute结束之后会才调用commit()方法,适用于所有的Job。
如果你想要指定job是否让JTA事务包装它的执行,那么你应该在Job类上使用@ExecuteInJTATransaction注解。
除了Quartz会自动将Job执行包装到事务中,当使用JobStoreCMT时,Scheduler接口上的调用也会参与到事务中。在调用scheduler的方法之前,要确保已经启动了事务。你可以通过使用UserTransaction直接启动,或者将你的代码放到使用容器托管事务的SessionBean中。