SpringBoot整合Quartz實現定時任務(單任務、多工)
阿新 • • 發佈:2019-01-22
前言:為了實現如:定時傳送郵件,訂單超時等操作需要使用到任務排程,為了節約自己封裝的時間所以使用Quatrz開源專案來幫助我們實現這些繁雜的操作,Quatrz內部有自己的執行緒池,不需要我們去手動維護執行緒,而且支援cron表示式等,下面我們講解一下使用Springboot2.x來整合Quatrz
1,先是匯入依賴,少了依賴可不行
<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.itpengwei.diao</groupId> <artifactId>boot-quartz</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--必須新增,要不然會出錯,專案無法啟動 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> </dependency> <!--必須新增,要不然會出錯,專案無法啟動 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
第二步:建立任務類,這裡我就建立兩個來實現多工,單任務也是同理
package com.itpengwei.config; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.stereotype.Component; @Component @EnableScheduling public class FirstJob { public void task() { System.out.println("任務1執行....當前時間為" + dateFormat().format(new Date())); } private SimpleDateFormat dateFormat() { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss"); return simpleDateFormat; } }
package com.itpengwei.config; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.stereotype.Component; @Component @EnableScheduling public class SecondJob { public void task() { System.out.println("任務2執行....當前時間為" + dateFormat().format(new Date())); } private SimpleDateFormat dateFormat() { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss"); return simpleDateFormat; } }
第三步:將任務進行配置,專案啟動就會開始執行了
package com.itpengwei.config;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
@Configuration
public class QuartzConfiguration {
// 配置定時任務1
@Bean(name = "firstJobDetail")
public MethodInvokingJobDetailFactoryBean firstJobDetail(FirstJob firstJob) {
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
// 是否併發執行
jobDetail.setConcurrent(true);
// 為需要執行的實體類對應的物件
jobDetail.setTargetObject(firstJob);
// 需要執行的方法
jobDetail.setTargetMethod("task");
return jobDetail;
}
// 配置觸發器1
@Bean(name = "firstTrigger")
public SimpleTriggerFactoryBean firstTrigger(JobDetail firstJobDetail) {
SimpleTriggerFactoryBean trigger = new SimpleTriggerFactoryBean();
trigger.setJobDetail(firstJobDetail);
// 設定任務啟動延遲
trigger.setStartDelay(0);
// 每10秒執行一次
trigger.setRepeatInterval(10000);
return trigger;
}
// 配置定時任務2
@Bean(name = "secondJobDetail")
public MethodInvokingJobDetailFactoryBean secondJobDetail(SecondJob secondJob) {
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
// 是否併發執行,假如設定為10秒一次,如果上一次因為到了時間沒有執行那麼當前這個任務會併發執行,
// 如果為false的話就會等上一次執行完才執行
jobDetail.setConcurrent(true);
// 為需要執行的實體類對應的物件
jobDetail.setTargetObject(secondJob);
// 需要執行的方法
jobDetail.setTargetMethod("task");
return jobDetail;
}
// 配置觸發器2
@Bean(name = "secondTrigger")
public CronTriggerFactoryBean secondTrigger(JobDetail secondJobDetail) {
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setJobDetail(secondJobDetail);
// cron表示式,每過10秒執行一次
trigger.setCronExpression("0/10 * * * * ?");
return trigger;
}
// 配置Scheduler
@Bean(name = "scheduler")
public SchedulerFactoryBean schedulerFactory(Trigger firstTrigger, Trigger secondTrigger) {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
// 延時啟動,應用啟動5秒後
bean.setStartupDelay(5);
// 註冊觸發器
bean.setTriggers(firstTrigger, secondTrigger);
return bean;
}
}