gpt4 book ai didi

java - 基于 Cron 的作业,位于数据库中

转载 作者:行者123 更新时间:2023-12-04 09:16:53 26 4
gpt4 key购买 nike

我正在尝试编写一个进程,它从存储在数据库中的一组记录中读取 cron 表达式并运行一个作业(如果该表达式在接下来的一个小时内触发,则执行一个程序)。数据库中带有 cron 表达式的记录可以有不同的触发时间(如星期五或每小时等)。
带有 cron 表达式的表示例。

----------

0 0 12 * * ? , 12Noon, AJOB
----------

0 11 11 11 11 ? , Nov 11, BJOB
----------

0 15 10 * * ? , EveryDay 10: 15, XJOB
----------
用户可以在表中更新此 cron。
设计这种应用程序的最佳方法是什么?
我在这里看到的主要问题如下:假设我每 1 小时运行一次我的工作并记录下一个小时内安排的记录并运行我的工作,当应用程序启动时,这看起来一切都很好。如果应用程序停机 2 小时,我们可能会错过一些需要在那时触发的作业。
如何编写这种应用程序,记住应用程序可能会失败,但我们不应该在停机期间错过任何 cron?
cron API 也有 nextTriggerTime ,但对之前触发时间的支持要少得多。

最佳答案

由于 Akka 是问题标签之一,我假设您正在寻找一些基于 Akka 的解决方案。
对于 JVM 中类似 cron 的作业调度程序,可能直接使用 Quartz(如 Ashiq 所建议的),它是 Java,应该很容易集成到 Scala+Akka 项目中。另外,看看akka-quartz-scheduler .它与 Akka 很好地集成,并提供了 cron 工具。
在应用方面:

  • 在数据库或磁盘中维护一个检查点表,以更合适的为准,以指示“如果 cron 作业 ID=X 已运行”
  • 您的应用程序在启动时将所有 cron 表达式加载到内存中,并在所有这些表达式上触发 quartz 调度程序。如果应用程序没有崩溃,它将继续运行。
  • 每次您的应用成功运行 cron 作业时,更新检查点表。
  • 如果您的应用程序崩溃并重新启动,请首先查找检查点表以了解它所在的位置,然后调度尚未完成的作业。
  • 关于java - 基于 Cron 的作业,位于数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63178815/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com