跳到主要内容

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

版权声明


這是 google 廣告