springboot-整合quartz:做分布式定时任务
完整代码下载链接:
https://github.com/2010yhh/springBoot-demos.git
环境
idea2018,jdk1.8,
springboot版本:springboot1.5.9.RELEASE,
1.quartz应用场景
应用中会有很多定时任务需要执行,一台服务器已经不能满足使用,需要解决定时任务单机单点故障问题
用Quartz框架,在集群环境下,通过数据库锁机制来实现定时任务的执行;独立的 Quartz 节点并不与另一其的节点或是管理节点通信。Quartz 应用是通过数据库表来感知到另一应的。
注意:集群环境下,时钟应当要同步
2配置
quartz下载:
http://www.quartz-scheduler.org/downloads/
解压后需要,运行tables_mysql_innodb.sql创建表(解压后如在D:\软件\quartz-2.2.3-distribution\quartz-2.2.3\docs\dbTables下)
qrtz_blob_triggers : 以Blob 类型存储的触发器。
qrtz_calendars:存放日历信息, quartz可配置一个日历来指定一个时间范围。
qrtz_cron_triggers:存放cron类型的触发器。
qrtz_fired_triggers:存放已触发的触发器。
qrtz_job_details:存放一个jobDetail信息。
qrtz_locks: 存储程序的悲观锁的信息(假如使用了悲观锁)。
qrtz_paused_trigger_graps:存放暂停掉的触发器。
qrtz_scheduler_state:调度器状态。
qrtz_simple_triggers:简单触发器的信息。
qrtz_trigger_listeners:触发器监听器。qrtz_triggers:触发器的基本信息。
cron方式需要用到的4张数据表:
qrtz_triggers,qrtz_cron_triggers,qrtz_fired_triggers,qrtz_job_details
pom需要:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
3.测试
项目中可以在监听器中初始化所有的job或者做成动态可修改、可管理的job。job1设置10s,job2设置30s
1)启动1个进程server.port=8080
2)启动2个进程,会发现,job1和job2交替的在2个进程中执行,同一时刻同一个job只有一个进程在执行
server.port=8080 的进程
server.port=8090的进程
3)关掉一个进程,另一个进程会接管所有job继续执行