當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring Boot定时任务-SpringBoot整合Quartz
生活随笔
收集整理的這篇文章主要介紹了
Spring Boot定时任务-SpringBoot整合Quartz
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
如何通過SpringBoot整合Quartz框架,我們首先去創建一個項目,接下來我們需要在pom文件里添加坐標,我們在使用SpringBoot整合Quartz的時候,需要添加哪些坐標呢,我們來看一下,在這里我們需要添加三個坐標,第一個是quartz的坐標<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version><exclusions><exclusion><artifactId>slf4j-api</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions>
</dependency>我們在SpringBoot整合Quartz的時候,把日志記錄的jar包去掉,一個exclusions就可以了,因為這個已經在WEB啟動器里面包含了,第二個我們還得去導入spring-context-support 的jar包<dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId>
</dependency>這個jar包我們之前用過,就是用Spring自帶的Schedule,用它去做定時任務的時候,其實我們現在使用SpirngBoot去整合Quartz的時候,SpringBoot對于Quartz的支持,仍然需要spring-context-support這個jar包,Spring-tx,事務的jar包<dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId>
</dependency>我們在Quartz當中呢,把這個jar包拿過來,在這里把這三個添加進來,修改pom文件,添加坐標,第一個我們修改完畢以后呢,接下來我們就可以去做我們的定時任務了,我們還是先去創建一個Job的任務類,我把它放到一個叫Quartz的包下,/*** Job類*/
public class QuartzDemo2 implements Job {@Overridepublic void execute(JobExecutionContext arg0) throws JobExecutionException {System.out.println("Execute2...."+new Date());}}需要讓他去實現一個Job接口,這個是我們的任務類,我們任務調用會觸發的一個方法,我們這里打印一句話,有了任務類以后呢,有了任務類以后呢,接下來我們就來編寫一個在SPRINGBoot當中,Quartz的配置類,那么在這個配置類當中呢,我們就要去完成SpringBoot對于Quartz的一些配置信息,既然是配置類,還有一個@Configuration的注解,在這里我要提供三個方法,這三個方法分別是干嘛的呢,其實就是使用Quartz基本的實現,第一個是創建Job對象,第二步就是創建Trigger對象,然后第三步就是創建我們的Scheduler對象,我們接下來看,這每一個步驟該怎么去做,我們先來看第一步,創建Job對象,要用到一個@Bean標簽,然后在這里要提供一個方法,這個方法要返回一個JobDetailFactoryBean對象,然后我們起個名,這個名叫什么都行,然后在這個方法當中呢,我們要去創建JobDetailFactoryBean對象,最后我們的方法肯定是返回這個factory對象,既然我們來看一下,在這個對象當中,怎么去關聯我們已定義的Job,現在Job是類,我怎么把它實例化出來,怎么關聯他呢,在我們的方法當中,關聯我們自己的Job類,factory下面有一個方法叫setJobClass,在這里把我們的Job類的模板給他,然后將我們的factory返回,這樣就完成了一個Job實例化的工作,/*** 1.創建Job對象*/
@Bean
public JobDetailFactoryBean jobDetailFactoryBean(){JobDetailFactoryBean factory = new JobDetailFactoryBean();//關聯我們自己的Job類factory.setJobClass(QuartzDemo2.class);return factory;
}第二步我們來創建Trigger,這種Trigger也是分為兩種,一種是簡單的Trigger,還有一個是cron的Trigger,先來創建一個簡單的Trigger,我們用的是SimpleTriggerFactoryBean,我們需要這個方法返回一個SimpleTriggerFactoryBean的返回值,然后這個方法名叫什么都可以,在這個對象當中呢,就完成一個Trigger的實例,Trigger的創建,首先我肯定要先去new這個對象,最后也是返回這個factory,然后我們在這個對象下,怎么去關聯我們的JobDetailFactoryBean,我們不是已經把Job類和JobDetail類關聯了嗎,那我們的Trigger也就是什么時間做,做什么做關聯,所以我這個方法需要一個入參,這個入參的類型就是我們返回返回的類型,然后在這里,我們通過SimpleTriggerFactoryBean對象,調他的一個方法,setJobDetail,那么這個job在哪兒呢,是不是在jobDetailFactoryBean里面放的呢,我們用入參來getObject,這樣就關聯了我們的JobDetail對象,除了關聯這個對象以外,Trigger是要設置一個觸發的時間的,那我們來看怎么來設置它的觸發時間,在這里我們就用他的一個方法,叫setRepeatInterval,這個方法里需要一個Long型的參數,這個Long型的參數是什么呢,其實就是一個毫秒數,這里我們加一個說明,該參數表示一個執行的毫秒數,他的單位是毫秒,比如我們還是讓他以兩秒的間隔執行我們的任務,我們這里給一個2000,這里只是表示他不停的重復,除此之外我們還可以設置他的重復次數,比如我們之前再講簡單案例的時候,在這里我們也可以設置重復的次數,這個叫setRepeatCount,執行5次,重復4次,這個是設置重復次數,/*** 2.創建Trigger對象* 簡單的Trigger*/
@Bean
public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){SimpleTriggerFactoryBean factory = new SimpleTriggerFactoryBean();//關聯JobDetail對象factory.setJobDetail(jobDetailFactoryBean.getObject());//該參數表示一個執行的毫秒數factory.setRepeatInterval(2000);//重復次數factory.setRepeatCount(5);return factory;
}創建的是一個簡單的Trigger,其實第三步就是創建Scheduler對象的,還是用一個@Bean,然后這里會提供一個方法,這個方法會返回一個SchedulerFactoryBean,所以他們都會返回一個什么factoryBean,這里我們給他起一個名字,這個方法叫什么都行,我們之前講過Scheduler的作用,會幫我們的Job,還有Trigger整合到一起,那我們現在已經完成了Job到Trigger的一個整合,我們已經做了一個關聯,我們就把Trigger關聯到Scheduler的對象當中,所以我們這個方法仍然需要一個入參,這個入參類型就是cronTriggerFactoryBean,在這里我們仍然是創建SchedulerFactoryBean的對象,最后我肯定也是返回這個factory,然后=我們在這里如何去關聯呢,第一個我們先關聯Trigger,關聯Trigger我們就是用方法setTriggers,是不是在SimpleTriggerFactoryBean這里放著呢,通過入參調用getObject,這樣就把工廠的TriggerBean對象取出來,放到Scheduler的對象當中,然后接下來我們需不需要在這里去啟動呢,我們原來在寫這個案例的時候知道,我設置完Scheduler的時候,要用到Scheduler的對象去啟動,這里很顯然不用了,這樣我們一個整合的過程就完成了,那怎么啟動呢,這里還要回到我們的啟動類里面去說@Bean
public SchedulerFactoryBean schedulerFactoryBean(SimpleTriggerFactoryBean simpleTriggerFactoryBean){SchedulerFactoryBean factory = new SchedulerFactoryBean();//關聯triggerfactory.setTriggers(simpleTriggerFactoryBean.getObject());return factory;
}這里是編寫Quartz的配置類,然后我們怎么去啟動呢,在啟動類當中,SpringBoot整合Quartz的案例,我們仍然要用@EnableScheduling的注解,這樣才能去啟動我們的Quartz@SpringBootApplication
@EnableScheduling
public class QuartzApp {public static void main(String[] args) {SpringApplication.run(QuartzApp.class, args);}
}修改啟動類,那么其實我們使用SpringBoot去整合Quartz,已經整合完畢了,我們來測試一下,從啟動類開始啟動,然后我們觀察控制臺,以兩秒的間隔去重復,然后我們定的是5次,我們給的是重復五次factory.setRepeatCount(5);重復五次,然后再加上1次就是6次,沒有問題的,以上就是使用SpringBoot整合Quartz的一個案例,但是這里注意一下,現在我們用的Trigger呢,簡單的Trigger,如果還想用cron,來定義這個Trigger,我們可以在這里去實現一下,/*** Cron Trigger*/
@Bean
public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){CronTriggerFactoryBean factory = new CronTriggerFactoryBean();factory.setJobDetail(jobDetailFactoryBean.getObject());//設置觸發時間factory.setCronExpression("0/2 * * * * ?");return factory;
}這個是Cron Trigger,我們還是提供一個bean注解,然后在里面加一個方法,現在返回的就是一個CronTriggerFactoryBean,這個是比較簡單的,方法名還是叫cronTriggerFactoryBean,然后在這個方法里仍然需要一個jobDetailFactoryBean,那么在這個方法里肯定是需要一個CronTriggerFactoryBean的,然后這里肯定是返回factory,然后我們還是要設置job的關聯,關聯Job對象,然后設置一個時間,怎么設置呢,factory.setJobDetail(jobDetailFactoryBean.getObject()),然后還是設置觸發時間,這里通過setCronExpression,cron的表達式,那么我還是讓他每兩秒去執行一次,@Bean
public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean){SchedulerFactoryBean factory = new SchedulerFactoryBean();//關聯triggerfactory.setTriggers(cronTriggerFactoryBean.getObject());return factory;
}我們看一下,每兩秒,沒有問題,第一次他隔了一秒,其實它第一次計時的時候,第一次時間和第二次時間多多少少有些誤差,但是問題不大,以上就是SpringBoot整合Quartz的一個實現,還是比較簡單的
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.learn</groupId><artifactId>spring-boot-quartz</artifactId><version>0.0.1-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.12.RELEASE</version></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><!-- springBoot的啟動器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 添加Scheduled坐標 --><!-- <dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId></dependency> --><!-- Quartz坐標 --><!-- <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version></dependency> --><!-- Quartz坐標 --><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version><exclusions><exclusion><artifactId>slf4j-api</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency><!-- 添加Scheduled坐標 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId></dependency><!-- Sprng tx 坐標 --><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId></dependency></dependencies>
</project>
package com.learn.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;import com.learn.quartz.QuartzDemo2;/*** Quartz配置類* @author Leon.Sun**/
@Configuration
public class QuartzConfig {/*** 1.創建Job對象*/@Beanpublic JobDetailFactoryBean jobDetailFactoryBean(){JobDetailFactoryBean factory = new JobDetailFactoryBean();//關聯我們自己的Job類factory.setJobClass(QuartzDemo2.class);return factory;}/*** 2.創建Trigger對象* 簡單的Trigger*/
// @Bean
// public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){
// SimpleTriggerFactoryBean factory = new SimpleTriggerFactoryBean();
// //關聯JobDetail對象
// factory.setJobDetail(jobDetailFactoryBean.getObject());
// //該參數表示一個執行的毫秒數
// factory.setRepeatInterval(2000);
// //重復次數
// factory.setRepeatCount(5);
// return factory;
// }/*** Cron Trigger*/@Beanpublic CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){CronTriggerFactoryBean factory = new CronTriggerFactoryBean();factory.setJobDetail(jobDetailFactoryBean.getObject());//設置觸發時間factory.setCronExpression("0/2 * * * * ?");return factory;}// @Bean
// public SchedulerFactoryBean schedulerFactoryBean(SimpleTriggerFactoryBean simpleTriggerFactoryBean){
// SchedulerFactoryBean factory = new SchedulerFactoryBean();
// //關聯trigger
// factory.setTriggers(simpleTriggerFactoryBean.getObject());
//
// return factory;
// }/*** 3.創建Scheduler對象*/@Beanpublic SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean){SchedulerFactoryBean factory = new SchedulerFactoryBean();//關聯triggerfactory.setTriggers(cronTriggerFactoryBean.getObject());return factory;}
}
package com.learn;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;/*** *spring Boot 整合Quartz案例**/
@SpringBootApplication
@EnableScheduling
public class QuartzApp {public static void main(String[] args) {SpringApplication.run(QuartzApp.class, args);}
}
?
總結
以上是生活随笔為你收集整理的Spring Boot定时任务-SpringBoot整合Quartz的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot定时任务-Quar
- 下一篇: Spring Boot定时任务-Job类