@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(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 "";
}
当在集群环境下的时候,如果任务的执行或操作依赖一些共享资源的话,就会存在竞争关系。如果不引入分布式锁等机制来做调度的话,就可能出现预料之外的执行结果。所以,@Scheduled 注解更偏向于使用在单实例自身维护相关的一些定时任务上会更为合理一些,比如:定时清理服务实例某个目录下的文件、定时上传本实例的一些统计数据等。
我这只是单实例,所以选择这个。。。
End.
Copyright: 采用 知识共享署名4.0 国际许可协议进行许可 Links: https://lixj.fun/archives/springboot2x使用scheduled实现定时任务