SpringBoot 定时任务@Scheduled详解

来源:互联网 发布:网络机房整改目的 编辑:程序博客网 时间:2024/06/07 16:32
@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@EnableSchedulingpublic class ScheduleConfig implements SchedulingConfigurer {    @Override    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {        taskRegistrar.setScheduler(taskExecutor());    }    @Bean(destroyMethod="shutdown")    public Executor taskExecutor() {        return Executors.newScheduledThreadPool(10);    }}
0 0