SpringBoot的定时任务搭建我在上一篇博客有较为详细的介绍,这里就不在做具体的解释了,我们来侧重查看一下@Scheduled这个注解的具体用法,这里根据spring文档上说的具体用法做一个简单的实践。
我们先来看一下@Scheduled注解源码
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;
@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 fixedDelayString() default "";
long fixedRate() default -1L;
String fixedRateString() default "";
long initialDelay() default -1L;
String initialDelayString() default "";
}
接下来侧重讲一下3个常见参数:
1.fixedRate参数,传入一个时间间隔,单位是毫秒,这里是指每5s执行一次
/**
* 时间间隔设置
*/
@Scheduled(fixedRate = 5000)
public void testTask() {
//这里定义一个时间,方便观察注解对计划任务的具体作用
logger.info("每5s执行一次:时间{}", format.format(new Date()));
}
结果:
2018-11-25 16:38:18.392 INFO 15108 --- [pool-2-thread-1] c.m.schedule.task.UpdateSaleNumTask : 每5s执行一次:时间2018-11-25 16:38:18
2018-11-25 16:38:23.392 INFO 15108 --- [pool-2-thread-1] c.m.schedule.task.UpdateSaleNumTask : 每5s执行一次:时间2018-11-25 16:38:23
2018-11-25 16:38:28.392 INFO 15108 --- [pool-2-thread-1] c.m.schedule.task.UpdateSaleNumTask : 每5s执行一次:时间2018-11-25 16:38:28
2018-11-25 16:38:33.392 INFO 15108 --- [pool-2-thread-1] c.m.schedule.task.UpdateSaleNumTask : 每5s执行一次:时间2018-11-25 16:38:33
2.cron参数,传递一个cron表达式,可以按照cron的逻辑执行代码
@Scheduled(cron = "0/5 * * * * ?")
public void testTask() {
logger.info("每5s执行一次:时间{}", format.format(new Date()));
}
结果:
2018-11-25 16:44:15.001 INFO 10800 --- [pool-2-thread-1] c.m.schedule.task.UpdateSaleNumTask : 每5s执行一次:时间2018-11-25 16:44:15
2018-11-25 16:44:20.001 INFO 10800 --- [pool-2-thread-1] c.m.schedule.task.UpdateSaleNumTask : 每5s执行一次:时间2018-11-25 16:44:20
2018-11-25 16:44:25.001 INFO 10800 --- [pool-2-thread-1] c.m.schedule.task.UpdateSaleNumTask : 每5s执行一次:时间2018-11-25 16:44:25
2018-11-25 16:44:30.002 INFO 10800 --- [pool-2-thread-1] c.m.schedule.task.UpdateSaleNumTask : 每5s执行一次:时间2018-11-25 16:44:30
3.fixedDelay参数,传入一个以毫秒为单位的时间间隔
@Scheduled(fixedDelay = 5000)
public void testTask(){
logger.info("每5s执行一次:时间{}", format.format(new Date()));
}
结果:
2018-11-25 16:50:07.949 INFO 13736 --- [pool-2-thread-1] c.m.schedule.task.UpdateSaleNumTask : 每5s执行一次:时间2018-11-25 16:50:07
2018-11-25 16:50:12.949 INFO 13736 --- [pool-2-thread-1] c.m.schedule.task.UpdateSaleNumTask : 每5s执行一次:时间2018-11-25 16:50:12
2018-11-25 16:50:17.950 INFO 13736 --- [pool-2-thread-1] c.m.schedule.task.UpdateSaleNumTask : 每5s执行一次:时间2018-11-25 16:50:17
注意一点,这个参数和fixedRate有所不同,他会等待上一个任务执行完再接着往下执行
4.initialDelay 这个参数是指在任务开启后多少毫秒后执行,这里的代码意思是任务开启20s后,每5s执行一次
@Scheduled(fixedDelay = 5000,initialDelay = 20000)
public void testTask(){
logger.info("每5s执行一次:时间{}", format.format(new Date()));
}
结果:
2018-11-25 16:58:11.574 INFO 15172 --- [pool-2-thread-1] c.m.schedule.task.UpdateSaleNumTask : 每5s执行一次:时间2018-11-25 16:58:11
2018-11-25 16:58:16.575 INFO 15172 --- [pool-2-thread-1] c.m.schedule.task.UpdateSaleNumTask : 每5s执行一次:时间2018-11-25 16:58:16
2018-11-25 16:58:21.577 INFO 15172 --- [pool-2-thread-1] c.m.schedule.task.UpdateSaleNumTask : 每5s执行一次:时间2018-11-25 16:58:21
上面的就是@Scheduled注解的一些常见使用方法的总结