SpringBoot 定时任务@Scheduled详解

时间:2022-12-29 08:14:00
@Scheduled是Spring的一个定时任务注解,通过注解配置就能够轻量级的定时任务,简单方便。
## <一>注解使用说明 ##
package org.springframework.scheduling.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.scheduling.annotation.Schedules;

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
//根据石英表达式执行
String cron() default "";

//指定时间地区,默认系统时间地区
String zone() default "";

//上一次执行成功后多少毫秒后执行
long fixedDelay() default -1L;

//同上,只不过值是String形式
String fixedDelayString() default "";

//固定速率执行
long fixedRate() default -1L;

//同上,只不过值是String形式
String fixedRateString() default "";

//延迟多少毫秒后执行
long initialDelay() default -1L;

//同上,只不过值是String形式
String initialDelayString() default "";
}
//石英表达式(每一分钟执行一次),具体的就不在这描述啦
@Scheduled(cron = "0 0/1 * * * ?")
public void run() {
//执行代码
}
//定义一个按一定频率执行的定时任务,每隔1分钟执行一次,延迟1秒执行
@Scheduled(fixedRate = 1000 * 60,initialDelay = 1000)
public void run() {
//执行代码
}
//上一个任务完成后,两分钟后执行
@Scheduled(fixedDelay = 1000 * 120)
public void run() {
//执行代码
}
## <二>执行原理##
这篇博客对执行原理讲解的很详细。
(http://blog.csdn.net/DanLei824/article/details/52149685)

## <三>串行,并行##
spring task Scheduled默认的线程数是1,多个任务相当于串行,但是对于某个任务来说还是串行,设置了线程数也没用,当前job1没执行完前,下个job1就没法执行,但是不影响job2。
要想并行执行多个job,就得修改配置
<task:annotation-driven scheduler="scheduler" mode="proxy"/>  
<task:scheduler id="scheduler" pool-size="10"/>

或者继承SchedulingConfigurer类并重写其方法即可,如下:

@Configuration
@EnableScheduling
public class ScheduleConfig implements SchedulingConfigurer {

@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
}

@Bean(destroyMethod="shutdown")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(10);
}
}