springboot Scheduled相关问题~

发布于 2022-09-07 19:52:39 字数 1119 浏览 35 评论 0

现在有个定时任务在项目里面,是每天凌晨执行一次,但是有一天数据量特别大,任务跑了一天还没跑完,一直执行到了第二天,然后这个任务又开始执行了。所以造成了数据的重复

相关代码

    /***
     * 每天凌晨一点sqlserver数据库抓取数据
     * @throws Exception 系统异常
     */
    @Scheduled(cron = "0 0 1 * * ?")
    public void switchDate(){}

这么写的,现在我想让任务执行的时候看上一次同一任务执行完没,如果没有执行完就推迟任务执行时间。我查过资料就是类似 Quartzconcurrent 属性,是这么说的:

其中 concurrent 属性标识的解释为:对于相同的 JobDetail ,当指定多个 Trigger 时, 很可能第一个job 完成之前,第二个 job 就开始了。指定 concurrent 设为 false,多个 job 不会并发运行,第二个job 将不会在第一个 job 完成之前开始。

那么此处的第二个 job 到底是被推迟执行了,还是被取消了呢? 今天带着这个疑问做了一个小实验,具体做法如下:将任务的 Trigger 设置为每 10 秒钟执行一次,然后在执行的任务体内让 Thread 暂停 15 秒钟,这样不同的 job 之间肯定会有时间上的重叠。当启动程序之后,发现前一个 job 执行结束的时刻的秒数为15,而且第二个本来在 10s 就执行的 job 马上就启动了。

由此可见,concurrent属性实际是将job推迟执行了。

各位有谁知道吗?小弟表述不清的地方...对不住了( •̀ ω •́ )y

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

︶葆Ⅱㄣ 2022-09-14 19:52:39

spring默认使用的是单线程executor,应该不会有第一个没执行完就执行第二个这种情况发生。或者你可以整合quartz: https://docs.spring.io/spring...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文