我知道NTP服務器可用於同步您計算機的系統時鐘。但是NTP可以被那些想要與其他系統同步的應用程序使用嗎?在Java應用程序中調度任務時如何使用NTP服務器?
場景:開發一個Java應用程序(可能在像Mule這樣的ESB中運行),並且您不一定能夠控制它運行的機器的時間。您的應用程序可以使用NTP服務器來獲取基於該時間運行的時間和計劃任務嗎?假設你使用Quartz作爲調度程序,並且可能需要處理時間(如果這很有用)。時間不一定要非常精確,只是想確保遠遠超出遠程系統。
我知道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年以來似乎並沒有更新最高命中。下面是一個相關的StackOverflow問題:[Java NTP客戶端](http://stackoverflow.com/questions/925191/java-ntp-client) – 2012-04-03 16:25:20