>@Scheduled实现定时任务
最近需要做一些定时任务刷数据,本着快速简单的原则,选择使用 Spring Boot 内置的 @Scheduled 实现。
实现起来很简单,步骤如下:
## 创建定时任务
```
@Component
@Slf4j
public class TestJob {
@Scheduled(fixedDelay=5000)
public void execute() {
//设置日期格式
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long start = System.currentTimeMillis();
log.info("开始执行: " + df.format(new Date()));
log.info("执行完成: " + df.format(new Date()));
}
}
```
需要在类上加 `@Component` 注解,对应的方法加上 `@Scheduled` 注解。
然后需要在 Spring Boot 主类上加 `@EnableScheduling` 注解。
```
@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
```
接着启动项目就行了。。。

## @Scheduled 注解
上文中使用了 `@Scheduled(fixedRate = 5000)` 注解表示每过5秒执行一次任务。
通过查看源码可以看到还有很多配置方式。
```
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
String CRON_DISABLED = "-";
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 "";
}
```
- cron:通过cron表达式来配置执行规则
- zone:cron表达式解析时使用的时区
- fixedDelay:上一次执行结束到下一次执行开始的间隔时间(单位:ms)
- fixedDelayString:上一次任务执行结束到下一次执行开始的间隔时间,使用 java.time.Duration#parse 解析
- fixedRate:以固定间隔执行任务,即上一次任务执行开始到下一次执行开始的间隔时间(单位:ms),若在调度任务执行时,上一次任务还未执行完毕,会加入worker队列,等待上一次执行完成后立即执行下一次任务
- fixedRateString:与fixedRate逻辑一致,只是使用 java.time.Duration#parse 解析
- initialDelay:首次任务执行的延迟时间
- initialDelayString:首次任务执行的延迟时间,使用 java.time.Duration#parse 解析
# 局限性
当在集群环境下的时候,如果任务的执行或操作依赖一些共享资源的话,就会存在竞争关系。如果不引入分布式锁等机制来做调度的话,就可能出现预料之外的执行结果。所以,@Scheduled 注解更偏向于使用在单实例自身维护相关的一些定时任务上会更为合理一些,比如:定时清理服务实例某个目录下的文件、定时上传本实例的一些统计数据等。
>我这只是单实例,所以选择这个。。。
-------------------------------------------------------------
End.

Spring Boot 2.x 使用@Scheduled实现定时任务