前言
使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式:
-
一、基于注解(@Scheduled)
-
二、基于接口(SchedulingConfigurer) 前者相信大家都很熟悉,但是实际使用中我们往往想从数据库中读取指定时间来动态执行定时任务,这时候基于接口的定时任务就派上用场了。
-
三、基于注解设定多线程定时任务
本篇文章介绍基于注解(@Scheduled)的方式创建2个定时任务,修改定时任务线程池。
其他方式创建定时任务查看以下这篇文章。
一、pom文件添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
二、创建定时任务
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
@Component
public class SchedulerTask {
private int count1=0;
private int count2=0;
@Scheduled(cron="*/5 * * * * ?")
private void process2(){
System.out.println(getTime()+"线程222运行次数 "+(count2++)+"——线程名称:"+Thread.currentThread().getName());
}
@Scheduled(cron="*/5 * * * * ?")
private void process1() throws InterruptedException {
System.out.println(getTime()+"线程111运行次数 "+(count1++)+"——线程名称:"+Thread.currentThread().getName());
Thread.sleep(5000);
}
private String getTime () {
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
return dateFormat.format(new Date());
}
}
三、在appllication上添加@EnableScheduling注解,并配置定时任务线程池
![springboot-task](https://gitee.com/exu/mybook/raw/master/assets/springboot-task.png)import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
@EnableScheduling
@SpringBootApplication
public class SpringbootTaskApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTaskApplication.class, args);
}
@Bean
ThreadPoolTaskScheduler threadPoolTaskScheduler() {
//核心线程数,默认为1
ThreadPoolTaskScheduler threadPoolTaskExecutor = new ThreadPoolTaskScheduler();
threadPoolTaskExecutor.setPoolSize(1);
return threadPoolTaskExecutor;
}
}
四、执行效果
2个定时任务都是每5s执行一次,也就只会有一个线程执行。
五、@Scheduled注解参数说明
使一个方法定时被执行的注解。其属性cron/fixedDelay/fixedRate必须有一个被指定
该注解标记的方法没有参数,也没有返回值。即使写了返回值,也会被忽略。
该注解被ScheduledAnnotationBeanPostProcessor处理器解析。
可以手动注册该bean,当然更方便的是使用<task:annotation-driven/>配置或者@EnableScheduling注解。
这个注解可以用来作为一个meta-annotation通过属性覆盖去创建自定义的组合注解。
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
// cron表达式
String cron() default "";
// corn表达式的时区,默认为空,使用服务器的local time zone。
String zone() default "";
// 周期为在最后一次调用结束和下一次调用开始,以毫秒为单位,
// 固定周期地执行注释的方法。
long fixedDelay() default -1;
// 周期间隔为在最后一次调用结束和下一次调用开始,以毫秒为单位,
// 固定周期地执行注释的方法。
String fixedDelayString() default "";
// 固定周期地执行注解方法,周期为调用间隔,单位为毫秒
long fixedRate() default -1;
String fixedRateString() default "";
// fixedRate() 或fixedDelay()第一次执行前延迟的毫秒数
long initialDelay() default -1;
// fixedRate() 或fixedDelay()第一次执行前延迟的毫秒数
String initialDelayString() default "";
}