首页 » Java » Quartz » 正文

Quartz框架入门二:基于Quartz的定时调度集群配置详解

前言:在上一篇文章(https://www.zifangsky.cn/844.html)中我介绍了“在Spring中集成Quartz的两种方式”。在这一篇文章中我将继续介绍基于Quartz的定时调度集群配置

(1)Quartz集群:

所谓Quartz集群,简单来说就是将使用了Quartz框架的项目部署到多个地位等价的服务器上(PS:每台服务器上部署了同一个基于Quartz的项目),这些项目节点之间的关系类似于master——slave。同一时间只有一个节点执行定时调度任务,当某一时刻这个执行任务的节点因为某种原因不能正常工作之后,其他的某个节点将会接过任务的执行权,继续执行定时调度任务。从而保证了整个集群的定时调度任务执行的可用性

那么现在问题来了,当某一个节点宕机之后,其他节点是如何知道的呢?或者说整个集群是如何保证了同一时间只有一个项目节点在执行任务?

其实这个问题的原因很简单,那就是Quartz框架使用了数据库来保存整个集群的状态,包括:有多少JobDetail、有多少Trigger、有哪些服务器节点以及它们的可用性状态、当前是哪个节点在执行任务等等。因此,当某个节点变得不可用时,其他节点就可以通过读取数据库的状态,然后选出一个可用的节点继续执行任务

下面我将以具体的实例来详细说明整个配置步骤:

(2)导入数据库文件:

quartz-2.2.3/docs/dbTables 这个路径下选择当前使用的数据库对应的SQL文件,然后导入到数据库中

我这里测试是用的是MySQL,因此导入了“tables_mysql_innodb.sql”这个SQL文件

(3)定义一个测试任务TestJob.java:

(4)自定义“jobFactory”用于在Job中注入Spring管理的bean:

(5)Quartz相关配置文件context_quartz.xml:

关于这里的一些基本配置的含义可以自行参考我写的上篇文章,这里就不详细解释了。需要说明的是在这里引用的数据源、事务等配置都已经定义在Spring的配置文件中了。同时这里引用的“quartz.properties”文件是这样的:

注:关于这个配置可以参考quartz-2.2.3/examples/example10目录下的这个文件

(6)测试:

将这个测试项目导出成war包,然后分别放到两个不同端口的Tomcat上运行

i)可以发现只有一个节点在执行上面设置的控制台打印任务

ii)停掉这个执行任务的Tomcat,然后可以看到另一个Tomcat接过了执行权,继续执行控制台打印任务

到此,整个基于Quartz的定时调度集群就全部配置完成了

发表评论

*