如何在 Spring Boot 中執行排程,很常用的功能,但老是記不起來,決定寫篇筆記做個範本,以後如果要用到的話,就可以直接抄,就可以直接使用 範本快速產生需要的功能
新增 build.gradle 內容
在 build.gradle 新增一行
implementation 'org.springframework.boot:spring-boot-starter-quartz'
新增要執行的內容
這個部份 method 的部份就是要在排程執行的內容,以下範例就只是單純的印出 Hello + 時間,請自行修改,沒什麼特別的,annotation 記得要加就好
import java.util.Date;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;
@Configuration
@Component
@EnableScheduling
public class QuartzTask {
public void sayHello() {
SimpleDateFormat sf = new SimpleDateFormat("HH:mm:ss");
System.out.println("Hello:" + sf.format(new Date()));
}
}
新增 Quartz 程式
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.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
@Configuration
public class QuartzConfigration {
@Bean(name = "scheduler")
public SchedulerFactoryBean schedulerFactory(Trigger... triggers) {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
// 用於quartz集群,QuartzScheduler 啓動時更新己存在的Job
bean.setOverwriteExistingJobs(true);
// 延時啓動,應用啓動1秒後
bean.setStartupDelay(1);
// 註冊觸發器
bean.setTriggers(triggers);
return bean;
}
// ------------- -------------\\
@Bean(name = "sayHelloJobDetail") // 指定 jobDetail 名稱
public MethodInvokingJobDetailFactoryBean jobDetail(QuartzTask task) {
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
jobDetail.setConcurrent(false);
jobDetail.setTargetObject(task);
jobDetail.setTargetMethod("sayHello"); // 對應上支程式要執行的 method
return jobDetail;
}
@Bean
public CronTriggerFactoryBean jobTrigger(JobDetail sayHelloJobDetail) {
String cron = "0,30 * * * * ? *"; // 排程設定
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setJobDetail(sayHelloJobDetail); // 對應要執行的 jobDetail 名稱
trigger.setCronExpression(cron);
return trigger;
}
}
注意事項,有三個 method
- schedulerFactory 這個照抄就可以,不需要改
- jobDetail 和 jobTrigger 是一組的,設定一個排程需要一組,有兩組以上的排程的話,要注意 bean 的名稱對應
以上範例當 spring boot 執行起來後,就可以看到每 30 秒會在 console 印出一行 Hello 了