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=100010, fixedRate=5000)//延迟10秒后执行第一次,之后按fixedRate的规则每5秒执行一次
@Scheduled(initialDelay=100010, 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);
}
}