我知道 NTP 服务器可用于同步您计算机的系统时钟。但是,想要与其他系统同步安排事情的应用程序可以使用 NTP 吗?
场景:开发一个 java 应用程序(可能在像 Mule 这样的 ESB 中运行),您不一定能够控制它运行的机器的时间。您的应用程序能否使用 NTP 服务器获取时间并根据该时间安排任务运行?
假设您使用 Quartz 作为调度程序,也许使用 joda-time 来处理时间(如果有用的话)。时间不必非常精确,只是想确保不会领先于远程系统太多。
我知道 NTP 服务器可用于同步您计算机的系统时钟。但是,想要与其他系统同步安排事情的应用程序可以使用 NTP 吗?
场景:开发一个 java 应用程序(可能在像 Mule 这样的 ESB 中运行),您不一定能够控制它运行的机器的时间。您的应用程序能否使用 NTP 服务器获取时间并根据该时间安排任务运行?
假设您使用 Quartz 作为调度程序,也许使用 joda-time 来处理时间(如果有用的话)。时间不必非常精确,只是想确保不会领先于远程系统太多。
如果您不太担心漂移,并且假设机器不只是随机更改时间,那么您可以 ping NTP 服务器以获取 IT 认为的时间,并将其与本地机器认为的时间进行比较是的,然后计算差异并最终在本地时间安排您的任务。
因此,例如,假设 NTP 服务器说现在是 12:30,但您的本地计算机说现在是 12:25。并且您希望您的任务在 NTP 时间 13:00 开始。
所以,12:25 - 12:30 = -0:05。13:00 + (-0:05) = 12:55,因此您将任务安排在 12:55。
附录——
我不能说实现的天真,我对协议不够熟悉。
最后,它归结为您可以接受的实际准确性水平。NTP 用于在系统之间同步时间。它解决的问题之一是通过不断地调用,它可以防止时钟蠕变。如果您使用“NTP Ping, schedule with offset”技术,并且假设未来时间可能是未来 8 小时,那么时钟爬行的可能性非常大,这意味着尽管您希望任务在“ 12:55",当 12:55 左右滚动时,它可能会从原始 NTP 服务器关闭,因为时钟尚未同步(根本),并且该作业尚未重新安排为虚拟重新同步。
显然,原始计划和实际执行之间的时间越长,漂移的可能性就越大。无论原始 NTP ping 有多好,这都是一个神器。如果您不打算在这些任务接近执行时间时重新安排这些任务以补偿漂移,那么任何“合理”的 NTP 实现都将适合。
有一个具有 NTP 客户端的 Apache Commons NET 库。有人抱怨它使用 System.currentTimeMillis(),它在 Windows 上有(有?)分辨率问题(10-15 毫秒)。System.nanoTime 解决了这个问题,您可以轻松更改库以使用它,并重新构建它。
我无法谈论它如何反映实施的“幼稚”。但最终归结为您需要多近地保持两台机器及其工作(实际上)同步。
我的直觉告诉我,NTP 需要硬件时钟调整才能跟上节奏。因此,如果您无法访问硬件,则无法执行此操作。
但是,如果几秒钟的精度就足够了,您可以定期从服务器发送采样时间以计算系统时钟之间的偏差并调整作业的计划时间。
但是,想要与其他系统同步安排事情的应用程序可以使用 NTP 吗?
我从来没有听说过它被这样使用。但是,没有什么可以阻止您为网络时间协议 (RFC 1305) 实现客户端。完整的 NTP 实现可能有点过头了,但您也可以在 SNTP 模式 (RFC 2030) 下使用该协议。
如果您想要高可用性和合理的准确性,您可能想要设置和使用本地 NTP 服务器。
谷歌搜索表明那里有许多 Java NTP 客户端......