跳至主要内容

如何在 Spring Boot 執行排程?Quartz 簡單筆記

· 3 分鐘閱讀
Eric Cheng

如何在 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 了



版權聲明

,轉載請註明出處
本文連結: https://tech.havocfuture.tw/blog/spring-boot-quartz



這是 google 廣告