quartz系列(二)spring3.2.5与quartz2.1.7集群版集成简要说明
一 概述
集成细节,本文不再复述,请参考之前的quartz1.8.6单机版的集成文章
quartz系列(一)spring3.2.5与quartz1.8.6单机版集成详细说明 http://phl.iteye.com/blog/906313
,本文侧重讲解与quartz2.1.7集群版的集成。现今互联网“高端大气上档次”的应用,都会避免单点故障,提供集群方案。
集群版的功能如下:
1)部署多台服务器,同一时间有且只有一台服务器触发定时任务;
2)可以提供任务恢复机制,如果某一时,段所有集群都宕机,那么启动的时候,可以选择是否恢复继续执行没有执行到的定时任务;
3)可以避免单点故障,如果某一节点执行作业一半的时候失败,则其可以配置他节点重新执行这个作业;
4)如果一个任务执行时间过长,可以设置下一个任务执行的策略,并发执行,还是串行执行;
5)作业集群的服务端本质上是一个锁服务器,可以使用mysql,也可以使用terracotta;
6)quartz集群版,去掉定时的特性也可以理解为分布式线程池;
7)客户端的策略是抢占式锁,所以有一定的负载均衡的功能。
terracotta与mysql服务器锁实现比较
1)与基于数据库的JobStoreTx或JobStoreCMT实现的Quartz集群相比较,Terracotta基于内存的实现执行起来会快很多。Terracotta基于字段的数据变化处理使得任务和触发器的修改速度超快;
2)简单易用。不需要任何数据库的安装配置;
3)失败的任务可以立即被恢复。而基于数据库的实现则需要在制定的时间间隔内对调度器作检查才能完成恢复;
4)不需要JGroups或者其它集群配置;
5)terracotta和quartz是一家公司的技术,高度集成;同时terracotta提供了GUI管理界面,运维人员可以方便的管理集群;
6)基于数据库的实现,由于使用select for update语句,所以经常造成死锁,影响集群运行。
二 与spring的集成
项目结构,先上图
除了参考之前的集成文章以外,需要注意以下几点:
1)增加包
quartz-terracotta-2.3.5.jar
${terracotta_home}/common/terracotta-toolkit-1.6-runtime-5.5.0.jar
2)增加配置文件
quartz.properties
3)修改并扩展spring源码
quartz2.1和1.8接口发生了很大的变化,单机版集成没有问题,如果想集成集群版,则需要自己扩展。
xorg.springframework.scheduling.quartz.JobWrapper.java
4)启动调试:在java客户端使用quartz集群时
问题一
Caused by: java.lang.NoClassDefFoundError: org/terracotta/express/ClientFactory
把common目录下的terracotta-toolkit-1.0-runtime-1.0.0.jar文件拷贝到classpath就可以了。
问题二
terracotta客户端与com.googlecode.jmockit的JAR包不能一起使用,否则报错
三 terracotta
安装参考
quartz系列(三)terracotta2.3.5详细安装教程 http://phl.iteye.com/blog/1993833
比较好用的是
1)主备配置
2)GUI集群管理界面
3)maven引用与集成
http://terracotta.org/documentation/more/apache-maven
pom.xml引用如下
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.1.7</version> </dependency> <dependency> <groupId>org.terracotta.quartz</groupId> <artifactId>quartz-terracotta</artifactId> <version>2.3.5</version> </dependency> <dependency> <groupId>org.terracotta.toolkit</groupId> <artifactId>terracotta-toolkit-1.6-runtime</artifactId> <version>5.5.0</version> </dependency>