前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springboot的定时任务的方法周期比方法的运行时间长

springboot的定时任务的方法周期比方法的运行时间长

作者头像
CBeann
发布2023-12-25 17:42:01
1040
发布2023-12-25 17:42:01
举报
文章被收录于专栏:CBeann的博客CBeann的博客

文章提出

在写一个从接口中读取实时数据然后存到自己数据库的小demo时候,发现数据从某一天到现在的都停止了。

先说一下上面读数据存数据的简单逻辑:定时任务从redis中读取上次读取到的时间点timeA,然后从timeA每次加1小时访问接口读取这一小段的代码,然后发现某一小时timeB没数据,把这个时间timeB存到redis中,到下次定时任务的时候在调用。

我的操作就是找到最早没有读到的时间点,然后修改redis中的时间点,启动定时任务就好了。

but   因为间隔的时间比较长,所以任务方法执行的时间超过了定时任务的周期,那么问题来了???

比如我定时任务是每一小时执行一次,我方法执行了1.5个小时。项目从1点启动,1点开始执行定时任务,那么2点的时候任务还没有执行完毕,那么任务是否又开启一个???

代码实操

测试代码1
代码语言:javascript
复制
@Component
public class TaskComponent {


    /**
     * 任务周期是2秒
     * 任务执行时间是3秒
     */
    @Scheduled(cron = "0/2 * * * * ?  ")//每2秒执行一次
    public void sendMessage() {

        System.out.println("定时任务开始执行: " + LocalDateTime.now());

        try {
            TimeUnit.SECONDS.sleep(3);
            System.out.println("(业务逻辑)发送消息: " + LocalDateTime.now());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

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

    public static void main(String[] args) {
        SpringApplication.run(ScheduleDemoApplication.class, args);
    }
}
测试代码2
代码语言:javascript
复制
@Component
public class TaskComponent {


    /**
     * 任务周期是2秒
     * 任务执行时间是3秒
     */
    @Scheduled(cron = "0/2 * * * * ?  ")//每2秒执行一次
    @Async
    public void sendMessage() {

        System.out.println("定时任务开始执行: " + LocalDateTime.now());

        try {
            TimeUnit.SECONDS.sleep(3);
            System.out.println("(业务逻辑)发送消息: " + LocalDateTime.now());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}
代码语言:javascript
复制
@SpringBootApplication
@EnableScheduling
@EnableAsync
public class ScheduleDemoApplication {

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

结论

1)如测试代码1,默认情况下,当定时任务的周期小于方法的执行时间时,定时任务会跳过方法还没有执行完毕的那次(比如我规定1小时执行一次,但是任务的执行时间是1.5小时。当前时间为0点,开始执行定时任务,但是当到1点时候又该执行定时任务了,但是该定时任务还没有执行完,所以跳过。下次执行就是2点的时候了)

2)如测试代码2,如果要实现无论任务是否执行完,都开启新任务的需求,@EnableAsync  @Async

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章提出
  • 代码实操
    • 测试代码1
      • 测试代码2
      • 结论
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档