Spring Boot與Quartz整合
阿新 • • 發佈:2018-12-29
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中的類去自定義,所以自由度很高,只能去了解原始碼進行定製還是挺方便的。
總結下:
主要就是配置
->定時任務
->任務觸發器
->任務排程工廠