为什么 JVM 在网络驱动器闪烁后无法恢复?



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

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

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

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

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

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

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

最新更新