quartz 学习(集群)

首先大家都清楚quartz最基本的概念就是job,在job内调用具体service完成具体功能,quartz需要把每个job存储起来,方便调度,quartz存储job方式就分三种,我们最常用的也是quartz默认的是RAMJobStore,RAMJobStore顾名思义就是把job的相关信息存储在内存里,如果用spring配置quartz的job信息的话,所有信息是配置在xml里,当spirng context启动的时候就把xml里的job信息装入内存。这一性质就决定了一旦JVM挂掉或者容器挂掉,内存中的job信息就随之消失,无法持久化。另外两种方式是JobStoreTX和JobStoreCMT,暂时不讨论这两者的区别,使用这两种JobStore,quartz就会通过jdbc直连或者应用服务器jndi连接数据库,读取配置在数据库里的job初始化信息,并且把job通过java序列化到数据库里,这样就使得每个job信息得到了持久化,即使在jvm或者容器挂掉的情况下,也能通过数据库感知到其他job的状态和信息。

    2 quartz集群各节点之间是通过同一个数据库实例(准确的说是同一个数据库实例的同一套表)来感知彼此,重要是以下几张表:
select * from qrtz_triggers t  
select * from qrtz_job_details
select * from qrtz_scheduler_state
select * from qrtz_locks
select * from qrtz_cron_triggers

如果使用spring配置,启动后会自动把job初始化尽量,对于集群的方式,配置quartz.properties文件

org.quartz.scheduler.instanceName = ccsScheduler
org.quartz.scheduler.instanceId = AUTO  --注意需要配置成AUTO,系统会根据机器名生成,如果多台机器同一个名称,会有莫名其妙的问题
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.isClustered = true  --集群模式

xml中配置


       
       
       
       
       
       
           
               

quartz的集群模式,就是一台机器执行,另一台机器不会执行,如果执行的机器有问题,另一台会接管。
如果在配置文件中增加了job,重启web服务器后可以执行到;如果在配置文件中删除了一个job,那么由于数据库中没有删除,该job会继续执行。
个人感觉这种集群方式解决了服务器宕机问题,但是并没有提高job并发执行的能力(当然这种能力需要写程序的人员处理一些问题,如定时发送邮件,就不能发送多封,但是有些数据处理类的问题可以通过多机提高并发能力

你可能感兴趣的:(quartz 学习(集群))