您现在的位置是:首页 > Javascript
当前栏目
springboot的定时任务的方法周期比方法的运行时间长
2023-03-14 22:51:52 时间
文章提出
在写一个从接口中读取实时数据然后存到自己数据库的小demo时候,发现数据从某一天到现在的都停止了。
先说一下上面读数据存数据的简单逻辑:定时任务从redis中读取上次读取到的时间点timeA,然后从timeA每次加1小时访问接口读取这一小段的代码,然后发现某一小时timeB没数据,把这个时间timeB存到redis中,到下次定时任务的时候在调用。
我的操作就是找到最早没有读到的时间点,然后修改redis中的时间点,启动定时任务就好了。
but 因为间隔的时间比较长,所以任务方法执行的时间超过了定时任务的周期,那么问题来了???
比如我定时任务是每一小时执行一次,我方法执行了1.5个小时。项目从1点启动,1点开始执行定时任务,那么2点的时候任务还没有执行完毕,那么任务是否又开启一个???
代码实操
测试代码1
@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(); } } }
@SpringBootApplication @EnableScheduling public class ScheduleDemoApplication { public static void main(String[] args) { SpringApplication.run(ScheduleDemoApplication.class, args); } }
测试代码2
@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(); } } }
@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
相关文章
- 鲜为人知但很有用的 HTML 属性
- 翻转再翻转!有意思的水平横向溢出滚动
- 自定义计数器小技巧!CSS 实现长按点赞累加动画
- 过五关!React高频面试题指南
- 软件开发中的十个认知偏差
- 不需要 JS!仅用 CSS 也能达到监听页面滚动的效果!
- 一文读懂TypeScript类型兼容性
- Vue 的响应式原则与双向数据绑定
- 快速掌握 TypeScript 新语法:Infer Extends
- JWT教你如何证明你是我的人!
- 一篇带给你 V8 GC 的实现
- 面试官:请使用JS完成一个LRU缓存?
- 通过可视化来学习JavaScript事件循环
- 新的跨域策略:使用 COOP、COEP 为浏览器创建更安全的环境
- 为什么有人说 vite 快,有人却说 vite 慢?
- 种草 Vue3 中几个好玩的插件和配置
- 超全面的前端工程化配置指南
- Vue 状态管理未来样子
- Volatile关键字能保证原子性么?
- 面试突击:SpringBoot 有几种读取配置文件的方法?