java - 当作业重叠时,spring @scheduled cron 的预期行为是什么?

标签 java spring cron

我有一个每小时运行一次的作业,我正在使用 Spring 的 @scheduled cron 来安排它。

如果工作需要一个多小时,我从How to prevent overlapping schedules in Spring?了解到在第一个作业运行时,下一个作业不会启动。

但这是否意味着它会在第一份工作完成后开始,还是错过了机会?

如果我有一个需要 10 小时的作业,所有错过的 cron 作业是否会排队,然后在第一个作业在 10 小时后完成时一个接一个地执行,还是只运行第一个作业?

谢谢!

最佳答案

默认情况下,执行是阻塞的和单线程的,这意味着它们不会并发运行。如果您希望作业同时运行,您也可以将该方法注释为 @Async。您可能还想查看不同的 Executors .

如果您像在您提供的示例问题中那样使用 fixedDelay,下一个作业只会在当前作业结束后开始,加上延迟。因此,如果您的工作需要 10 小时,并且您的 fixedDelay5000,则下一个工作将在 10 小时后的 5 秒后开始。

如果您正在使用 fixedRate,那么下一个预定事件将排队等待运行,但不会跳过,根据 documentation :

If any execution of this task takes longer than its period, then subsequent executions may start late, but will not concurrently execute.

如果您只是简单地使用cron,那么作业将依次排队和执行(类似于fixedRate)。您可以使用一个简单的方法对此进行测试(下面是在 Groovy 中,但也可以使用纯 Java):

    int i = 0

    @Scheduled(cron = '* * * * * * ')
    void test() {
        if (i < 5)
            Thread.sleep(10000)

        i += 1
        println '------------------------' + i // No values skipped
    }

您会注意到打印了每个数字;例如不会跳过任何循环。

关于java - 当作业重叠时,spring @scheduled cron 的预期行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48114936/

相关文章:

java - 将 blob 从数据库迁移到 jackrabbit 中的文件系统

node.js - 在单个进程中排队 javascript 代码

定时任务 : dump of mysql database and tar it

java - 包含存在的 JPQL 子查询

java - 将数组列表发送回父 Activity

java - 我正在尝试使用 java 下载 facebook 个人资料图片。但是出现错误

java - 在子线程中访问 HttpServletRequest 请求

java - 如何使用 Java 在 Redis 中查找两个键的交集?

spring - 如何在 Spring Boot 2.1.0 登录时禁用 Set-Cookie header 上的 HttpOnly 标志

php - Cron 不在 PHP Docker 容器中运行