0

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

如果给出以下内容:

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;
4

3 回答 3

2

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

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

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

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

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

于 2013-05-23T05:19:56.330 回答
1

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

于 2013-05-23T05:11:12.713 回答
1

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

在某些方面可能会稍微复杂一些(以及它的附加依赖项),但完全消除了时间风险。

于 2013-05-23T05:16:40.063 回答