繁体   English   中英

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

[英]Cron based jobs, which are in Database

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

带有 cron 表达式的表示例。

----------

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

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

0 15 10 * * ? , EveryDay 10: 15, XJOB
----------

用户可以在表中更新此 crons。

设计这种应用程序的最佳方法是什么?

我在这里看到的主要问题如下:假设我每 1 小时运行一次工作,并记录下一个小时内安排的记录并运行我的工作,当应用程序启动时,这看起来一切都很好。 如果应用程序关闭 2 小时,我们可能会错过一些需要在那时触发的工作。

如何编写这种应用程序,记住应用程序可能会失败,但我们不应该在停机期间错过任何 crons?

cron API 也有nextTriggerTime ,但对先前触发时间的支持要少得多。

由于 Akka 是问题标签之一,我假设您正在寻找一些基于 Akka 的解决方案。

对于 JVM 中的类似 cron 的作业调度程序,也许 go 直接与 Quartz 一起使用(如 Ashiq 建议的那样),它是 Java 项目,应该可以直接集成到 aScala 项目中。 另外,看看akka-quartz-scheduler 它与 Akka 很好地集成,并提供了 cron 实用程序。

在应用方面:

  1. 在 DB 或磁盘中维护一个检查点表,以更合适的为准,以指示“如果 cron 作业 ID=X 已运行”
  2. 您的应用程序在启动时将所有 cron 表达式加载到 memory 中,并在所有这些表达式上触发石英调度程序。 如果应用程序没有崩溃,它将继续运行。
  3. 每次您的应用程序成功运行 cron 作业时,更新检查点表。
  4. 如果您的应用程序崩溃并重新启动,请先查找检查点表以了解它的位置,然后调度尚未完成的作业。

您可以使用 Quartz,这是一个可以集成到 Java 的作业调度库。 它可以存储和触发 cron 作业和简单的作业。 它还具有失火策略,您可以在错过任何触发器的情况下使用这些策略。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM