在Java应用程序中调度任务时如何使用NTP服务器?

时间:2012-04-03 15:47:04

标签: java quartz-scheduler ntp

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

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

假设您使用Quartz作为调度程序,并且可能使用joda-time来处理时间(如果这很有用)。时间不一定非常精确,只是想确保不要远远超过远程系统。

3 个答案:

答案 0 :(得分:2)

如果您不是非常担心漂移,并且假设机器不只是随机改变时间,那么您可以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,使用偏移计划”技术,以及未来的未来时间可能是8小时,那么时钟蠕变的可能性很大,这意味着尽管您希望任务在“ 12:55“,当12:55滚动时,可能会从原始NTP服务器关闭,因为时钟尚未同步(根本没有),并且作业尚未重新安排为虚拟重新同步。

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

Apache Commons .NET库有一个NTP客户端。有人抱怨它使用System.currentTimeMillis(),它在Windows上有(有?)分辨率问题(10-15ms)。 System.nanoTime解决了这个问题,您可以轻松地更改库以使用它,并重建它。

我不能谈论它如何反映实施的“天真”。但最终归结为你需要将两台机器及其工作(几乎)保持同步的距离。

答案 1 :(得分:0)

  

但是,想要安排与其他系统同步的应用程序可以使用NTP吗?

我从来没有听说过这种方式被使用过。但是,没有什么可以阻止您实现网络时间协议(RFC 1305)的客户端。完整的NTP实现可能有点过分,但您也可以在SNTP模式下使用该协议(RFC 2030)。

如果您想要高可用性和合理的准确性,可能需要设置和使用本地NTP服务器。

谷歌搜索表明那里有许多Java NTP客户端......

答案 2 :(得分:0)

我的直觉告诉我,NTP需要硬件时钟调整以保持节奏。因此,如果您无法访问硬件,则无法执行此操作。

但是,如果足够精确到几秒钟,您可以定期从服务器发送采样时间来计算系统时钟之间的偏差并调整作业的预定时间。