都说好记性不如烂笔头,每天写一点,从量变到质变的开始!废话不多说,以下所有内容均来自本人实际操作:
前言:现在项目中定时任务一般都使用Quartz框架,Java虽然提供了Timer类但是一般都不用. Spring Boot整合了Quartz框架,用起来很方便,在此记录一下基本配置和实现.
环境:Windows10+JDK8+Spring Boot+Mysql8+Mybatis-Plus+Quartz
1.Spring Boot项目中引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
父项目依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
其他依赖可以根据自己使用习惯,不做重点,可基于开发中的项目
2.注解方式使用Quartz(主要使用@EnableScheduling和 @Scheduled)
@Slf4j
@EnableScheduling
@Configuration
public class DemoQuartz {
@Scheduled(cron = " 0/5 * * * * ? ")
public void myLogic1() {
log.info("调度任务1开始了");
}
@Scheduled(cron = " 0/10 * * * * ? ")
public void myLogic2() {
log.info("调度任务2开始了");
}
}
3.数据库方式使用Quartz(可以动态修改cron表达式/暂停/恢复等操作)
3.1 Mysql数据库中建表
CREATE TABLE demo_quartz_job (
id VARCHAR(32) PRIMARY KEY COMMENT '主键',
create_by VARCHAR(32) COMMENT '创建人',
create_time TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(32) COMMENT '修改人',
update_time TIMESTAMP COMMENT '修改时间',
job_class_name VARCHAR(100) COMMENT '任务类名',
cron_expression VARCHAR(100) COMMENT 'cron表达式',
parameter VARCHAR(100) COMMENT '参数',
description VARCHAR(100) COMMENT '描述',
status int(2) COMMENT '状态 0正常-1停止'
) COMMENT = '定时任务表';
3.2 yml配置文件中添加配置
单项目使用配置,不需要创建框架依赖表
spring:
quartz:
job-store-type: memory # quartz任务存储类型:jdbc或memory
wait-for-jobs-to-complete-on-shutdown: true # 关闭时等待任务完成
overwrite-existing-jobs: true # 可以覆盖已有的任务
properties: # quartz原生配置
org:
quartz:
scheduler:
instanceName: scheduler # 调度器实例名称
instanceId: AUTO # 调度器实例ID自动生成
jobStore:
class: org.quartz.simpl.RAMJobStore # RAMJobStore用于存储内存中的调度信息
threadPool:
class: org.quartz.simpl.SimpleThreadPool # 指定线程池实现类,对调度器提供固定大小的线程池
threadCount: 10 # 设置并发线程数量
threadPriority: 5 # 指定线程优先级
如果要集群配置如下,并且要在数据添加框架依赖表
spring:
quartz:
job-store-type: jdbc # quartz任务存储类型:jdbc或memory
wait-for-jobs-to-complete-on-shutdown: true # 关闭时等待任务完成
overwrite-existing-jobs: true # 可以覆盖已有的任务
properties: # quartz原生配置
org:
quartz:
scheduler:
instanceName: scheduler # 调度器实例名称
instanceId: AUTO # 调度器实例ID自动生成
jobStore:
# class: org.quartz.simpl.RAMJobStore # RAMJobStore用于存储内存中的调度信息
class: org.quartz.impl.jdbcjobstore.JobStoreTX # 调度信息存储处理类
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate # 使用完全兼容JDBC的驱动
tablePrefix: QRTZ_ # quartz相关表前缀
useProperties: false # 是否将JobDataMap中的属性转为字符串存储
threadPool:
class: org.quartz.simpl.SimpleThreadPool # 指定线程池实现类,对调度器提供固定大小的线程池
threadCount: 10 # 设置并发线程数量
threadPriority: 5 # 指定线程优先级
依赖表脚本
#
# In your Quartz properties file, you'll need to set
# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#
#
# By: Ron Cordell - roncordell
# I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz to create the tables in a MySQL database, modified to use INNODB instead of MYISAM.
DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
DROP TABLE IF EXISTS QRTZ_LOCKS;
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_SIMPROP