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