1.导入依赖包
<!-- quartz定时器 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency><!-- 该依赖必加,里面有sping对schedule的支持 -->
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
2.Quartz配置类
配置部分主要涉及到的就是Quartz的三个部分,JobDetail(创建任务)、JobTrigger(任务触发器)和Scheduler(任务调度)。其中JobDetail与JobTrigger的关系可以为一对一和多对一,JobTrigger与Scheduler也是一样,而之后的定时任务动态管理配置类就可以根据上面的关系去管理。
package com.itsm.conf.quartz;
import java.util.List;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import com.itsm.job.SyncWorkOrderFileTask;
/**
* @ClassName: QuartzConfigration
* @Description: Quartz配置
* @author lcy
* @date 2018年3月16日 上午11:32:50
*/
@Configuration
public class QuartzConfigration {
private Logger LOGGER = LoggerFactory.getLogger(QuartzConfigration.class);
/*----------------------------------- 每10分钟同步文件 ------------------------------------------*/
/**
* attention: Details:配置定时任务
*/
@Bean(name = "syncWorkOrderFile10MJobDetail")
public MethodInvokingJobDetailFactoryBean syncWorkOrderFile10MJobDetailFactoryBean(SyncWorkOrderFileTask task) {// task为需要执行的任务,即任务类
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
/*
* 是否并发执行 例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了,
* 如果此处为true,则下一个任务会执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行
*/
jobDetail.setConcurrent(false);
jobDetail.setName("syncWorkOrderFile10MJobDetail");// 设置任务的名字,自定义
jobDetail.setGroup("srd");// 设置任务的分组,自定义
// 这些属性都可以存储在数据库中,在多任务的时候使用
/*
* 为需要执行的实体类对应的对象
*/
jobDetail.setTargetObject(task);
/*
* syncWorkOrderFile10M为需要执行的方法
* 通过这几个配置,告诉JobDetailFactoryBean我们需要执行定时执行SyncWorkOrderFileTask类中的syncWorkOrderFile10M方法
*/
jobDetail.setTargetMethod("syncWorkOrderFile10M");
LOGGER.info("定时任务【同步工单文件】配置完成");
return jobDetail;
}
/**
* attention: Details:配置定时任务的触发器,也就是什么时候触发执行定时任务
*/
@Bean(name = "syncWorkOrderFile10MJobTrigger")
public CronTriggerFactoryBean syncWorkOrderFile10MCronJobTriggerFactoryBean(JobDetail syncWorkOrderFile10MJobDetail) {
CronTriggerFactoryBean jobTrigger = new CronTriggerFactoryBean();
/*
* 为需要执行的定时任务
*/
jobTrigger.setJobDetail(syncWorkOrderFile10MJobDetail);
jobTrigger.setCronExpression("0 0/10 * * * ?");// 初始时的cron表达式
jobTrigger.setName("syncWorkOrderFile10MJobTrigger");// trigger的name
LOGGER.info("定时触发器【同步工单文件】配置完成");
return jobTrigger;
}
/*----------------------------------- 测试任务 ------------------------------------------*/
@Bean(name = "testJobDetail")
public MethodInvokingJobDetailFactoryBean testJobDetailFactoryBean(TestTask task) {
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
jobDetail.setConcurrent(false);
jobDetail.setName("testJobDetail");
jobDetail.setGroup("srd");
jobDetail.setTargetObject(task);
jobDetail.setTargetMethod("sayGoodbye");
LOGGER.info("定时任务【测试】配置完成");
return jobDetail;
}
@Bean(name = "testJobTrigger")
public CronTriggerFactoryBean testCronJobTrigger(JobDetail testJobDetail) {
CronTriggerFactoryBean jobTrigger = new CronTriggerFactoryBean();
jobTrigger.setJobDetail(testJobDetail);
jobTrigger.setCronExpression("40-50 * * * * ?");
jobTrigger.setName("testJobTrigger");
LOGGER.info("定时触发器【测试】配置完成");
return jobTrigger;
}
/**
* attention: Details:定义quartz调度工厂
* 这里的参数为List,Spring会把上面声明的触发器都放到这个集合中
*/
@Bean(name = "scheduler")
public SchedulerFactoryBean schedulerFactory(List<Trigger> triggers) {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
// 用于quartz集群,QuartzScheduler 启动时更新己存在的Job
bean.setOverwriteExistingJobs(true);
// 延时启动,应用启动1秒后
bean.setStartupDelay(1);
/*
* 注册触发器
* 这里的setTriggers()方法,参数可以为多个Trigger,
* 所以将配置的每个触发器放入里面即可(但当触发器多时,这里的参数就会很多,目前没找到更好的方式)
*/
bean.setTriggers(triggers.get(0), triggers.get(1));
LOGGER.info("调度工厂配置完成,Quartz在应用启动1秒后启动");
return bean;
}
}
由于是使用Quartz中的类去自定义,所以自由度很高,只能去了解源码进行定制还是挺方便的。
总结下:
主要就是配置
->定时任务
->任务触发器
->任务调度工厂