2017-07-03 29 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

相关问题