SpringBoot定时任务

一、概述
@Scheduled注解是Spring Boot提供的用于定时任务控制的注解,主要用于控制任务在某个指定时间执行,或者每隔一段时间执行。注意需要启动项的application上加@EnableScheduling,@Scheduled需要加在方法上。
@Scheduled主要有以下几种配置执行时间的方式:
  • cron
  • fixedRate
  • fixedRateString
  • fixedDelay
  • fixedDelayString
  • initialDelay
  • initialDelayString

二、参数介绍

1、cron
这个corn表达式可以分为6个域或7个,由空格隔开。
当corn表达式里面为6个域时分别表示:秒 分 时 日 月 星期几
当corn表达式里面为7个域时分别表示:秒 分 时 日 月 星期几 年
@Scheduled(cron= "0/10 * * * * *")//每十秒执行一次
允许使用的通配符
"*" 表示所有值
"-" 表示区间
"?" 表示不指定值
"," 表示指定多个值
"/" 表示增量触发,例如秒元素中的"0/15" 表示从0秒开始,每15秒触发(0,15,30,45)
cron支持占位符
@Scheduled(cron = "${cron}")

2、fixedRate
 fixedRate 从上次调用开始到下一次调用之间的固定时间(以毫秒为单位)
@Scheduled(fixedRate = 5000)//上次开始无论是否结束5秒钟之后会再次执行


3、fixedRateString
与  fixedRate 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。
@Scheduled(fixedRateString = "5000")//上次开始无论是否结束5秒钟之后会再次执行


4、fixedDelay
fixedDelay 从上次调用结束到下一次调用之间的固定时间(以毫秒为单位)
@Scheduled(fixedDelay = 5000)//上次调用结束后5秒再执行


5、fixedDelayString
 fixedDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符
@Scheduled(fixedDelayString = "${time.fixedDelay}")


6、initialDelay
第一次执行 fixedRate 或者 fixedDelay 任务之前要延迟的毫秒数,不支持cron
@Scheduled(initialDelay=1000*10, fixedRate=5000)//延迟10秒后执行第一次,之后按fixedRate的规则每5秒执行一次
@Scheduled(initialDelay=1000*10, fixedDelay=5000)//延迟10秒后执行第一次,之后按fixedDelay的规则每5秒执行一次


7、initialDelayString
与 initialDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。
@Scheduled(initialDelay="1000", fixedRate=5000)//延迟1秒后执行第一次,之后按fixedRate的规则每5秒执行一次
@Scheduled(initialDelay="1000", fixedDelay=5000)//延迟1秒后执行第一次,之后按fixedDelay的规则每5秒执行一次


三、使用@Scheduled注意事项
1、spring的注解@Scheduled 需要写在实现方法上;
2、定时器的任务方法不能有返回值;
3、如果该方法需要与应用程序上下文的其他对象进行交互,通常是通过依赖注入来实现;
4、实现类上要有组件的注解@Component;
5、定时器默认为单线程;
6、使用cron表达式的方法,在项目首次启动后不会直接运行,而是等到执行周期才会执行,而fixedDelay、fixedRate方式的定时器方法,在项目启动成功后会马上开始执行一次,再按照时间周期执行;

 

四、代码实例

@Component
public class MyScheduled {

    @Scheduled(initialDelay =1000 * 3,fixedDelay=1000 * 10)
    public  void testScheduledFixedDelay() {
        System.out.println("MyScheduled[testScheduledFixedDelay] run:"+LocalDateTime.now());
    }

    @Scheduled(fixedRate=1000 * 10)
    public  void testScheduledFixedRate() {
        System.out.println("MyScheduled[testScheduledFixedRate] run:"+LocalDateTime.now());
    }

    @Scheduled(cron= "0/10 * * * * *")
    public  void testScheduledCron() {
        System.out.println("MyScheduled[testScheduledCron] run:" +LocalDateTime.now() );
    }

}

 

@SpringBootApplication
@EnableScheduling
public class SpringbootdemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootdemoApplication.class, args);
    }

}

 

 

 

posted @ 2022-04-24 16:02  #庄生晓梦  阅读(466)  评论(0编辑  收藏  举报