在Java应用程序中调度任务时如何使用NTP服务器?
我知道NTP服务器可用于同步您计算机的系统时钟。但是NTP可以被那些想要与其他系统同步的应用程序使用吗?在Java应用程序中调度任务时如何使用NTP服务器?
场景:开发一个Java应用程序(可能在像Mule这样的ESB中运行),并且您不一定能够控制它运行的机器的时间。您的应用程序可以使用NTP服务器来获取基于该时间运行的时间和计划任务吗?假设你使用Quartz作为调度程序,并且可能需要处理时间(如果这很有用)。时间不一定要非常精确,只是想确保远远超出远程系统。
但是NTP是否可以被一个想要与其他系统同步的应用程序使用?
我从来没有听说过它被这样使用。但是,没有什么可阻止您为网络时间协议(RFC 1305)实施客户端。完整的NTP实现可能是过度杀毒,但您也可以在SNTP模式下使用协议(RFC 2030)。
如果您想要高可用性和合理的准确性,您可能需要设置和使用本地NTP服务器。
谷歌搜索显示,有许多在那里的Java NTP客户端的...
我的直觉告诉我,NTP需要硬件时钟调整,以保持同步。所以如果你无法访问硬件,你就无法做到。但是,如果足够精确到几秒钟,则可以定期从服务器发送采样时间来计算系统时钟之间的偏差并调整作业的计划时间。
如果您对漂移没有超级担心,并且假设机器不只是随机更改时间,那么您可以ping一台NTP服务器以获得IT认为它是什么时间,并将其与您的时间进行比较本地机器认为它是,然后计算差异,并最终在当地时间安排你的任务。
因此,例如,说NTP服务器说它是12:30,但你的本地机器说它是12:25。你希望你的任务在13:00 NTP时间结束。
因此,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解决了这个问题,你可以很容易地改变库来使用它,并重建它。
我不能说它如何反映实施的“天真”。但最终还得归结为您需要保持两台机器与其工作(虚拟)之间的同步。
对。那么,“ping一台NTP服务器以获得IT认为是什么时间”的好方法是什么?我遇到了旧的“天真”[Java SNTP客户端](http://support.ntp.org/bin/view/Support/JavaSntpClient),但认为可能还有其他东西(理想情况下,尽管我可以对Joda进行排序那部分)。 – 2012-04-03 16:27:56
我环顾四周,发现了一个更新的java库:[AtomicDate](http://atomicdate.sourceforge.net/)我还没有把它拉下来看看它的文档。 – 2012-04-03 17:49:37
是的,但从2004年以来似乎并没有更新最高命中。下面是一个相关的*问题:[Java NTP客户端](http://*.com/questions/925191/java-ntp-client) – 2012-04-03 16:25:20