SpringBoot 定时任务@Scheduled详解

@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);
    }
}

你可能感兴趣的:(spring-boot,Scheduled,定时任务)