2017-07-03 57 views
0

Java應用程序從網絡驅動器上的Jar運行。如果由於某種原因Jar文件變得不可用,那麼就會出現NoClassDefFoundError。就像在示例網絡連接中丟失一樣。但我覺得奇怪的是,如果Jar文件所在的網絡驅動器上發生故障轉移,應用程序仍然會完全崩潰並且不會恢復。爲什麼在網絡驅動器彈起後JVM不能恢復?

故障轉移意味着網絡驅動器並沒有改變,它只是簡單的筆觸和再次可用的時候了,但它改變了一些內部低電平驅動的(基礎設施傢伙稱之爲節點)。發生故障轉移(節點更改)後,所有連接到在Citrix服務器中運行的應用程序的用戶都會得到相同的異常。

我會想,一旦網絡驅動器重新聯機,JVM應該能夠恢復,但它似乎試圖從Jar所在的舊節點獲取類,而不是從新節點獲取類。有誰知道爲什麼JVM會出現這種行爲?

+0

它只會嘗試加載JAR文件。它將其複製到本地臨時文件。 – EJP

+0

感謝您的評論,如果Jar文件被加載到本地臨時文件,那麼當網絡驅動器變得不可用時,Java應用程序會發出錯誤是沒有意義的。我描述的場景發生在Java應用程序正在運行時,也就是說,它已經成功地將從Jar運行所需的所有內容加載到內存中,直到故障轉移發生,並且故障轉移需要約一秒或更少的時間,並且在發生Jar在相同的網絡驅動器中仍然可用,但內部「節點」已更改。 – alejob2k

+0

但是由於網絡錯誤,JAR文件*無法*被加載到臨時文件*。* – EJP

回答

0

的JVM只打開一個文件一次,並保持手柄開到需要時從中讀取類。當網絡驅動器斷開連接時,句柄無效。

一個大概可以寫嘗試重新打開該文件,並驗證它確實是同一個文件之前,例如一個類加載器通過散列,但標準的實現不會因爲文件系統被認爲是可靠的。

大多數其他可執行程序從網絡驅動器開始都有可能出現類似的問題。

您應該使用集羣文件系統,網絡不失效應用程序可見的手柄,而是做透明故障轉移。

+0

謝謝你的解釋非常有用! – alejob2k

相關問題