一、问题分析
对于单机的任务调度,使用Quartz十分方便。但是在分布式情况下,对于集群中每台机器都会执行任务,从而造成了重复执行任务的问题。
二、解决思路
Quart不仅支持单机任务调度,同时也支持集群中的任务调度。原理如下:
在集群中,各个不同的机器公用同一个调度器,调度器按照一定的算法选择集群中某一台机器执行任务。
优点:
1、避免了每台机器都进行任务调度
2、避免了所有任务在单机执行造成性能下降
三、解决方案
要启用quartz的分布式任务调度处理,只需如下两个步骤,同时程序无需修改:
(1)在数据库中创建quartz需要的表。这些表由quartz自己维护,用于保存数据和维护程序运行状态,这些表对于程序员而言是透明的,不需要关注,只需创建好表即可。
(2)在工程的src下增加quartz.properties配置文件,进行集群相关操作的配置。
配置文件如下:
#==============================================================
#Configure Main Scheduler Properties
#==============================================================
#配置集群时,quartz调度器的id,由于配置集群时,只有一个调度器,必须保证每个服务器该值都相同,可以不用修改,只要每个ams都一样就行
org.quartz.scheduler.instanceName = Scheduler1
#集群中每台服务器自己的id,AUTO表示自动生成,无需修改
org.quartz.scheduler.instanceId = AUTO
#==============================================================
#Configure ThreadPool
#==============================================================
#quartz线程池的实现类,无需修改
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
#quartz线程池中线程数,可根据任务数量和负责度来调整
org.quartz.threadPool.threadCount = 5
#quartz线程优先级
org.quartz.threadPool.threadPriority = 5
#==============================================================
#Configure JobStore
#==============================================================
#表示如果某个任务到达执行时间,而此时线程池中没有可用线程时,任务等待的最大时间,如果等待时间超过下面配置的值(毫秒),本次就不在执行,而等待下一次执行时间的到来,可根据任务量和负责程度来调整
org.quartz.jobStore.misfireThreshold = 60000
#实现集群时,任务的存储实现方式,org.quartz.impl.jdbcjobstore.JobStoreTX表示数据库存储,无需修改
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#quartz存储任务相关数据的表的前缀,无需修改
org.quartz.jobStore.tablePrefix = QRTZ_
#连接数据库数据源名称,与下面配置中org.quartz.dataSource.myDS的myDS一致即可,可以无需修改
org.quartz.jobStore.dataSource = myDS
#是否启用集群,启用,改为true,注意:启用集群后,必须配置下面的数据源,否则quartz调度器会初始化失败
org.quartz.jobStore.isClustered = false
#集群中服务器相互检测间隔,每台服务器都会按照下面配置的时间间隔往服务器中更新自己的状态,如果某台服务器超过以下时间没有checkin,调度器就会认为该台服务器已经down掉,不会再分配任务给该台服务器
org.quartz.jobStore.clusterCheckinInterval = 20000
#==============================================================
#Non-Managed Configure Datasource
#==============================================================
#配置连接数据库的实现类,可以参照IAM数据库配置文件中的配置
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
#配置连接数据库连接,可以参照IAM数据库配置文件中的配置
org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/test
#配置连接数据库用户名
org.quartz.dataSource.myDS.user = yunxi
#配置连接数据库密码
org.quartz.dataSource.myDS.password = 123456
#配置连接数据库连接池大小,一般为上面配置的线程池的2倍
org.quartz.dataSource.myDS.maxConnections = 10
四、提示
不同项目只需修改数据库连接即可