gpt4 book ai didi

java - 在 Java 应用程序中安排任务时如何使用 NTP 服务器?

转载 作者:行者123 更新时间:2023-11-30 09:38:45 26 4
gpt4 key购买 nike

我知道 NTP 服务器可用于同步计算机的系统时钟。但是,想要与其他系统同步安排事情的应用程序可以使用 NTP 吗?

场景:开发一个 java 应用程序(可能像 Mule 一样在 ESB 中运行)并且您不一定能够控制它运行的机器的时间。您的应用能否使用 NTP 服务器获取时间并根据该时间安排任务运行?

假设您使用 Quartz 作为调度程序,可能使用 joda-time 来处理时间(如果有用的话)。时间不必非常精确,只是要确保不要比远程系统提前太多。

最佳答案

如果您不是特别担心漂移,并且假设机器不只是随机更改时间,那么您可以对 NTP 服务器执行 ping 操作以获取 IT 认为的时间,并将其与本地时间进行比较机器认为是,然后计算差异,最后在本地时间安排你的任务。

因此,例如,假设 NTP 服务器说现在是 12:30,但您的本地机器说现在是 12:25。您希望您的任务在 NTP 时间 13:00 结束。

因此,12:25 - 12:30 = -0:05。 13:00 + (-0:05) = 12:55,因此您将任务安排在 12:55。

附录--

我不能说实现的天真,我对协议(protocol)不够熟悉。

最终归结为您可以接受的实际准确度水平。 NTP 用于同步系统之间的时间。它解决的问题之一是通过不断调用,它可以防止时钟蠕变。如果你使用“NTP Ping, schedule with offset”技术,比如说, future 时间可能是 8 小时后,时钟爬行的可能性非常大,这意味着虽然你希望任务在“12:55",当 12:55 滚动时,它可能与原始 NTP 服务器断开,因为时钟尚未同步(根本),并且作业尚未重新安排以虚拟地重新同步。

显然,原始计划和实际执行之间的时间间隔越长,漂移的可能性就越大。无论原始 NTP ping 有多好,这都是一个 Artifact 。如果您不打算在这些任务接近执行时间时重新安排这些任务以补偿漂移,那么 NTP 的任何“合理”实现都有可能适合。

有一个具有 NTP 客户端的 Apache Commons NET 库。有些人提示它使用 System.currentTimeMillis(),它在 Windows 上有(曾经?)分辨率问题(10-15 毫秒)。 System.nanoTime 解决了这个问题,您可以轻松更改库以使用它,然后重建它。

我不能说它如何反射(reflect)实现的“幼稚”。但最终归结为您需要让两台机器及其作业(虚拟地)保持同步的程度。

关于java - 在 Java 应用程序中安排任务时如何使用 NTP 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9996835/

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