Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度,简单的说就是可以实现java的定时任务。
一、问题描述
但是,当在集群环境下,每一台服务器上都有这段定时发送信息的代码,多个服务器下如何用quartz协调处理自动化JOB。
如果现在有A,B,C三台机器同时作为集群服务器对外统一提供服务:
A、B、C三台机器上各有一个QUARTZ,他们会按照即定的SCHEDULE自动执行各自的任务。这样的架构其实有点像多线程,可能产生脏读,脏写。因为三台APP SERVER里都有QUARTZ,因此会存在重复处理TASK的现象。
一般有三种解决方案:
1.一般外面的解决方案是只在一台 APP 上装 QUARTZ,其它两台不装,这样集群就形同虚设了;
2.另一种解决方案是动代码,这样就要影响到原来已经写好的QUARTZ JOB的代码了,这对程序开发人员来说比较痛苦;
3.quartz自身提供了解决集群环境下配置的接口,通过重写类并进行配置即可。
下面,就详细介绍一下quartz在集群环境下如何配置。
二、quartz在集群下的配置
1.首先在quartz官网上下载相应的jar包。我下载的是quartz1-1.5.2.zip。
2.解压后在docs\dbTables目录下找到相应的数据库创建表的sql语句,并在数据库中执行该sql语句,执行后会创建十二张表。这里我使用的是mysql数据库,所以用的是tables_mysql.sql文件。
3.导入jar包quartz-all-1.5.2.jar,并Build Path。
注意:spring3.0不支持quartz2.0以上的版本,且quartz1.6.0版本有些问题,最好不要使用。
4.因为quartz在集群下配置依赖于将节点信息存放到数据库中,而org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean不支持序列化,不能将信息存放到数据库中,所以需要重写QuartzJobBean类。
importjava.lang.reflect.Method;importorg.apache.commons.logging.Log;importorg.apache.commons.logging.LogFactory;importorg.quartz.JobExecutionContext;importorg.quartz.JobExecutionException;importorg.springframework.context.ApplicationContext;importorg.springframework.scheduling.quartz.QuartzJobBean;public class MyDe