1. 程式人生 > >Spring Boot與Quartz整合

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