前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot 2.x 使用@Scheduled实现定时任务

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

作者头像
Li_XiaoJin
发布2022-06-10 21:42:10
3470
发布2022-06-10 21:42:10
举报
文章被收录于专栏:Lixj's Blog

@Scheduled实现定时任务

最近需要做一些定时任务刷数据,本着快速简单的原则,选择使用 Spring Boot 内置的 @Scheduled 实现。

实现起来很简单,步骤如下:

创建定时任务

代码语言:javascript
复制
@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 注解。

代码语言:javascript
复制
@SpringBootApplication
@EnableScheduling
public class Application {

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

}

接着启动项目就行了。。。

@Scheduled 注解

上文中使用了 @Scheduled(fixedRate = 5000) 注解表示每过5秒执行一次任务。

通过查看源码可以看到还有很多配置方式。

代码语言:javascript
复制
@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.

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可 Links: https://lixj.fun/archives/springboot2x使用scheduled实现定时任务

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-07-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建定时任务
  • @Scheduled 注解
  • 局限性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档