Spring Boot与Quartz整合

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中的类去自定义,所以自由度很高,只能去了解源码进行定制还是挺方便的。

总结下:

     主要就是配置

           ->定时任务

           ->任务触发器 

            ->任务调度工厂

https://blog.csdn.net/sinat_39572070/article/details/79735224

猜你喜欢

转载自blog.csdn.net/qq_36957587/article/details/85338086