简单的定时任务可以使用Spring的@Scheduled实现,而复杂些的定时任务则可以集成Quarzt实现
一:@Scheduled
- 创建一个Spring Boot Web 工程,添加web倚赖即可
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 在启动类上添加 @EnableScheduling 以开启定时任务
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
import java.util.Date;
@SpringBootApplication
@EnableScheduling
public class ScheduledApplication {
public static void main(String[] args) {
SpringApplication.run(ScheduledApplication.class, args);
}
}
- 配置定时任务
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class MySchedule {
//@Scheduled: 用来标注定时任务,其中fixedDelay =1000 表示当前任务执行结束1秒后开启另一个任务
@Scheduled(fixedDelay = 10000)
public void fixedDelay() {
System.out.println("fixedDelay:"+new Date());
}
//fixedRate表示当前任务执行开始2秒后开启另外一个定时任务
@Scheduled(fixedRate = 2000)
public void fixedRate() {
System.out.println("fixedRate:"+new Date());
}
//initialDelay表示首次执行的延迟时间
@Scheduled(initialDelay = 1000,fixedRate = 2000)
public void initialDelay() {
System.out.println("initialDelay:"+new Date());
}
//cron = "0 * * * * ?" 表达式表示该任务每分钟执行一次
@Scheduled(cron = "0 * * * * ?")
public void cron() {
System.out.println("cron:"+new Date());
}
}
配置完后即可启动项目,项目日志部分打印如下:
二:Quartz
- Quartz由Java写成,可以继承到任何Java应用中,使用Quartz 可以创建简单或者复杂的执行计划。其中在Spring Boot中集成Quartz 和在Spring 中继承较为类似。主要提供三个bean: JobDetail,Trigger以及SchedulerFacory
- 整合Spring Boot
创建好Spring Boot项目,添加Quartz倚赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
- 创建两个Job
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class MyFirstJob {
public void sayHello() {
System.out.println("MyFirstJob:sayHello:"+new Date());
}
}
import org.quartz.JobExecutionContext;
import org.springframework.scheduling.quartz.QuartzJobBean;
import java.util.Date;
public class MySecondJob extends QuartzJobBean {
private String name;
public void setName(String name) {
this.name = name;
}
//如果不提前直接注册为Bean,也可继承QuartzJobBean,并重写下面的方法
@Override
protected void executeInternal(JobExecutionContext context){
System.out.println("hello:"+name+":"+new Date());
}
}
- 创建QuartzConfig 对JobDetail和Trigger进行配置,其中涉及了Cron表达式
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.SimpleTrigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.*;
@Configuration
public class QuartzConfig {
//jobDetail1配置方式一:通过MethodInvokingJobDetailFactoryBean配置 ,
// 只需要指定Job的实例名和要调用的方法即可
@Bean
MethodInvokingJobDetailFactoryBean jobDetail1() {
MethodInvokingJobDetailFactoryBean bean =
new MethodInvokingJobDetailFactoryBean();
bean.setTargetBeanName("myFirstJob");
bean.setTargetMethod("sayHello");
return bean;
}
//配置方式二: 通过JobDetailFactoryBean,只需要setJobClass,
//通过jobDataMap 进行传递参数即可
@Bean
JobDetailFactoryBean jobDetail2() {
JobDetailFactoryBean bean = new JobDetailFactoryBean();
bean.setJobClass(MySecondJob.class);
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("name","sang");
bean.setJobDataMap(jobDataMap);
bean.setDurability(true);
return bean;
}
//Trigger的常用实现一:simpleTrigger
@Bean
SimpleTriggerFactoryBean simpleTrigger() {
SimpleTriggerFactoryBean bean =
new SimpleTriggerFactoryBean();
bean.setJobDetail(jobDetail1().getObject());
bean.setRepeatCount(3);//任务循环次数
bean.setStartDelay(1000);//任务启动延迟时间
bean.setRepeatInterval(2000);//任务的时间间隔
return bean;
}
//Trigger的常用实现二:cronTrigger
@Bean
CronTriggerFactoryBean cronTrigger() {
CronTriggerFactoryBean bean =
new CronTriggerFactoryBean();
bean.setJobDetail(jobDetail2().getObject());
bean.setCronExpression("* * * * * ?");//配置cron表达式
return bean;
}
//创建schedulerFactory,并配置Trigger
@Bean
SchedulerFactoryBean schedulerFactory() {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
SimpleTrigger simpleTrigger = simpleTrigger().getObject();
CronTrigger cronTrigger = cronTrigger().getObject();
bean.setTriggers(simpleTrigger,cronTrigger);
return bean;
}
}
- 启动项目进行测试,其中部分日志如下:其中 MyFirstJob在循环执行了三次之后不再执行,MySecondJob,每隔一秒执行一次,永不停止