检查自上次检查以来是不是有匹配单位的时间

Posted

技术标签:

【中文标题】检查自上次检查以来是不是有匹配单位的时间【英文标题】:Check if a time with matching units has past since the last check检查自上次检查以来是否有匹配单位的时间 【发布时间】:2013-05-23 05:08:41 【问题描述】:

我有一个需要在特定时间间隔触发的系统

如果给出如下:

minutes:25, seconds:10

它应该每小时触发一次,每小时 25 分 10 秒。例如,7:25:10、8:25:10、9:25:10 等。

这很简单,而且我已经让该代码工作了。问题是它只有在系统至少每秒检查一次时才有效,否则它将错过触发。

那么我如何检查自上次检查以来触发单位是否与当前时间单位匹配?检查之间的时间会有很大差异。

触发单元的存储方式如下:

// units that must match the current time <Calendar Unit, Trigger>
private Map<Integer, Integer> triggerUnits;

【问题讨论】:

【参考方案1】:

首先移动到枚举而不是映射。枚举可以包含小时、秒、天等等。好消息是这样的枚举已经存在于 JDK 中并且被称为TimeUnit。该枚举的每个成员都知道将时间转换为其他单位。

所以,解析字符串hour:5。将 5 小时转换为 3600*5*1000 毫秒。该值将在您的系统中使用。您有多种可能性,但我建议您从java.util.Timer 开始。每个任务都可以在计时器中安排。它使用一个线程来执行所有任务。

如果你愿意,你可以使用 Executors 框架:

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.schedule(...);

这里的schedule 方法直接使用时间单位。您甚至不必从一个单元翻译到另一个单元。

【讨论】:

+1 for ScheduledExecutorService 因为它是这里工作的正确工具。【参考方案2】:

每次触发系统时,存储下一次需要触发代码的时间。在检查的过程中,只需检查当前时间是否已经过了这个“下一次”,如果是,则触发系统。

【讨论】:

【参考方案3】:

不完全是您所要求的答案,但我建议使用cron4j:Predictor 听起来几乎正是您所需要的。将您的规范转换为 cron 格式,然后将其传递给 Predictor,它实际上会告诉您下一次执行的绝对时间。您可以安排您的检查在那个时间发生,或者使用 ScheduledExecutor 来触发作业。

在某些方面可能会稍微复杂一些(并且它是一个额外的依赖项),但完全消除了时间风险。

【讨论】:

以上是关于检查自上次检查以来是不是有匹配单位的时间的主要内容,如果未能解决你的问题,请参考以下文章

python 持久的监督观察员。当看门狗重新启动时,检查自上次启动以来是否有新/修改/删除/等文件或目录,并发送

查询自上次检查后条目是不是发生变化并持续检查一段时间

检查自 Woocommerce 订单下达以来是不是已过去 24 小时

检查 Windows 批处理文件中是不是经过了 20 秒

最新检查声称自 VS 2019 以来缺少构建输出

检查上次查询中是不是使用了缓冲区