前言
在SpringBoot中,自身提供了@Scheduled等注解实现简单的定时任务,但在面对较复杂的定时需求时,仍然需要使用quartz,即一有定时处理的需求,应该优先使用quartz来处理。
下面,将介绍在SpringBoot2.0中如何整合quartz,免去以前那种繁杂的xml配置方式,不涉及数据库保存定时记录等复杂内容。
SpringBoot版本
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
一、开始添加定时任务前的配置
1、在pom.xml中引入依赖
<!--spring boot2.x以前quartz相关依赖-->
<!--<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>${quartz.version}</version>
</dependency>-->
<!--spring boot2.x后quartz依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2、添加quartz的properties配置
在resources下,新建application-quartz.yml,内容如下
#quartz相关属性配置
spring:
quartz:
properties:
org:
quartz:
scheduler:
#scheduler实例名称与id分配
instanceName: clusteredScheduler
instanceId: AUTO
#job的保存设置
# jobStore:
# class: org.quartz.impl.jdbcjobstore.JobStoreTX
# driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# tablePrefix: QRTZ_
# isClustered: true
# clusterCheckinInterval: 10000
# useProperties: false
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 10
threadPriority: 5
threadsInheritContextClassLoaderOfInitializingThread: true
#数据库方式,默认使用memory的方式(此时不需要配置jobStore)
# job-store-type: jdbc
#初始化表结构
# jdbc:
# initialize-schema: never
在本例子中,使用memory的方式保存定时任务,所以不需要配置jobStore,其他配置意思见注释
3、配置自定义的Scheduler
新建类‘SchedulerCustomizer’,继承‘SchedulerFactoryBeanCustomizer’
/**
* @date 2019/3/3
* @des 配置自定义的Scheduler;注意,若在此设定scheduler延时启动N秒,
* 则job的启动时间(包括延时启动)便要大于或等于这个延时时间N
*/
@Configuration
@EnableScheduling
public class SchedulerCustomizer implements SchedulerFactoryBeanCustomizer{
@Override
public void customize(SchedulerFactoryBean schedulerFactoryBean) {
schedulerFactoryBean.setStartupDelay(5);//程序启动后5秒启动定时scheduler,注意这里的设置
schedulerFactoryBean.setAutoStartup(true);//job自启动
schedulerFactoryBean.setOverwriteExistingJobs(true);//覆盖已存在的job
}
}
接下来,便可以添加定时任务,进行测试啦。
定时任务的添加分为动态与静态两种,下面分别介绍。
二、添加定时任务
A、静态添加
新建一个类‘QuartzConfiguration’,如
/**
* @des 第1种创建job任务的方式,即通过配置类;每一个job都需要在此配值,提供两个bean,一个JobDetail,一个Trigger
*/
@Configuration
public class QuartzConfiguration {
}
使用SimpleSchedule
1、新建一个job,如
/**
* @des quartz 简单测试类
*/
@Slf4j
public class FirstJob extends QuartzJobBean{
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
String param = jobExecutionContext.getJobDetail().getJobDataMap().getString("first");
log.info("--FirstJob--:{} --" + LocalDateTime.now(), param);
}
}
2、在‘QuartzConfiguration’中配置相应的bean,如
/**
* @des 每一个job都需要在此配值,提供两个bean,一个JobDetail,一个Trigger
*/
@Configuration
public class QuartzConfiguration {
/*---使用simpleSchedule来添加任务---*/
// 使用jobDet