一、引言
在java中最常用的定時任務框架當屬quartz
了,早在spring boot還未釋出之前,spring就已經在spring-context-support包中對quartz進行了整合,而使用spring boot來整合quartz就變的尤為方便、快捷。
二、快速整合
2.1 pom引入starter依賴
spring boot最重要的就是它的外掛化設計
,想引入哪個模組或框架一般只需引入對應的starter即可,quartz也是一樣,如下
<!-- 整合quartz -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
(這裡的spring-boot-starter-quartz沒有寫明version版本,預設與spring boot的版本一致即可)。
在pom中點選spring-boot-starter-quartz進去可以看到其內部依賴spring-boot-starter、spring-context-support、spring-tx以及quartz
,如下
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.6.6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.3.18</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.18</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
<scope>compile</scope>
</dependency>
</dependencies>
2.2 定義任務類
自定義的任務類需要實現quartz提供的Job介面,樣例如下
/**
* 任務類
*/
public class MyJob1 implements Job {
@Autowired
private MyService1 myService1;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
// System.out.println("任務建立人:" + jobDataMap.getString("createUser"));
myService1.work();
}
}
如上程式碼中,任務類中可以直接使用@Autowired來注入bean
,這為我們編寫任務類時提供了很好的便利,不需要透過任務引數jobDataMap來傳入bean了。MyService1是一個簡單的bean,程式碼如下
@Service
public class MyService1 {
public void work() {
String now = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(now + ": service1正在工作...");
}
}
2.3 建立定時任務
下面透過定義一個ApplicationRunner,在spring容器啟動後,執行run方法來簡單地建立一個定時任務,程式碼如下
@Component
public class MyApplicationRunner implements ApplicationRunner {
@Autowired
private Scheduler scheduler;
@Override
public void run(ApplicationArguments args) throws Exception {
// 建立任務明細
JobDetail jobDetail = JobBuilder.newJob(MyJob1.class)
.withIdentity("myJob1", "job_group")
// .usingJobData("createUser", "kamier") // 可以放一些任務資料
.build();
// 建立觸發器,每隔5秒執行一次
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger1", "trigger_group")
.withSchedule(cronScheduleBuilder)
.build();
// 排程定時任務
scheduler.scheduleJob(jobDetail, trigger);
}
}
2.4 測試驗證
啟動spring boot工程後,控制檯列印如下,說明定時任務排程成功