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

标签 java quartz-scheduler ntp

我知道 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。

附录——

我无法谈论实现的天真,我对协议(protocol)不够熟悉。

最终取决于您可以接受的实际准确性水平。 NTP 用于同步系统之间的时间。它解决的问题之一是通过不断调用,它可以防止时钟蠕变。如果您使用“NTP Ping,带偏移量的计划”技术,并且假设 future 时间可能是 future 8 小时,则时钟蠕变的可能性非常大,这意味着尽管您希望任务在“12:55”,当 12:55 到来时,它可能会偏离原始 NTP 服务器,因为时钟尚未同步(根本),并且作业尚未重新安排为虚拟重新同步。

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

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

我无法说出它如何反射(reflect)了实现的“天真”。但最终取决于您需要保持两台机器及其作业(虚拟)同步的程度。

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

相关文章:

java - 将数据从左上角单元格移动到第一列的每一行

java - ElasticSearch 7 中的运算符 IN

java - SimpleThreadPool 的 Quartz ClassNotFoundException

c - C程序中的NTP时间戳

java - 使用 Hibernate 获取 BLOB LAZY 的最佳方法

Java继承子类和父类(super class)

java - 无法将 'logging.level.org.quartz' 下的属性绑定(bind)到 org.springframework.boot.logging.LogLevel

grails - 在grails中运行作业以每15分钟获取一次远程表数据

linux - 如何编码和解码64位格式的NTP时间戳?

python - 使用 Python 显示同步的 NTP 对等服务器源