【问题标题】:How use NTP server when scheduling tasks in Java app?在 Java 应用程序中调度任务时如何使用 NTP 服务器?
【发布时间】:2012-04-03 15:47:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: java quartz-scheduler ntp


    【解决方案1】:

    如果您不太担心漂移,并且假设机器不只是随机更改时间,那么您可以 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 解决了这个问题,您可以轻松更改库以使用它,然后重新构建它。

    我无法谈论它如何反映实施的“幼稚”。但归根结底,这取决于您需要使两台机器及其工作(实际上)保持同步的程度。

    【讨论】:

    • 对。那么“ping NTP 服务器以获取 IT 认为的时间”的好方法是什么?我遇到过旧的“天真”Java SNTP Client,但我认为可能还有别的东西(最好是 Joda 时间,尽管我可以把那部分整理出来)。
    • 我环顾四周,发现了一个更新的 java 库:AtomicDate 我还没有把它拉下来看它的文档。
    【解决方案2】:

    我的直觉告诉我,NTP 需要硬件时钟调整才能跟上节奏。因此,如果您无权访问硬件,则无法进行操作。

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

    【讨论】:

      【解决方案3】:

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

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

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

      Google 搜索表明有许多 Java NTP 客户端...

      【讨论】:

      • 是的,但自 2004 年以来似乎没有更新过热门歌曲。这是一个相关的 StackOverflow 问题:Java NTP client
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      相关资源
      最近更新 更多