为什么 JVM 在网络驱动器轻弹后不恢复?

Why JVM does not recover after network drive flicks?

Java 应用程序 运行 来自网络驱动器上的 Jar。如果 Jar 文件由于某种原因变得不可用,那么就会出现预期的 NoClassDefFoundError。就像示例中的网络连接丢失一样。但我觉得奇怪的是,如果在 Jar 文件所在的网络驱动器上发生故障转移,应用程序仍然会完全崩溃并且无法恢复。

故障转移意味着网络驱动器不会改变,它只会短暂闪烁并立即再次可用,但它会改变某种内部低级驱动器(基础设施人员称之为节点)。在发生故障转移(节点已更改)后,连接到 Citrix 服务器中 运行 应用程序的所有用户都会遇到相同的异常。

我本以为,一旦网络驱动器重新联机,JVM 应该能够恢复,但它似乎试图从 Jar 所在的旧节点而不是从旧节点获取 类新节点。有谁知道为什么 JVM 会出现这种行为?

JVM 只打开一个文件一次,并保持句柄打开以在需要时从中读取 类。当网络驱动器断开连接时,句柄将失效。

大概可以编写一个类加载器来尝试重新打开文件并验证它确实是与以前相同的文件,例如通过散列,但标准实现不是因为文件系统被认为是可靠的。

大多数其他从网络驱动器启动的可执行程序可能会遇到类似的问题。

您应该使用集群网络文件系统,它不会使应用程序可见的句柄失效,而是透明地进行故障转移。