Java 应用程序正在从网络驱动器上的 Jar 中运行。如果 Jar 文件由于某种原因变得不可用,则会出现预期的 NoClassDefFoundError 错误。就像示例中网络连接丢失一样。但我觉得奇怪的是,如果 Jar 文件所在的网络驱动器发生故障转移,应用程序仍然会完全崩溃并且无法恢复。
故障转移意味着网络驱动器不会改变,它只会短暂闪烁并立即再次可用,但它会更改某种内部低级驱动器(基础设施人员称之为节点)。发生故障转移(节点更改)后,连接到 Citrix 服务器中运行的应用程序的所有用户都会遇到相同的异常。
我本以为,一旦网络驱动器重新上线,JVM 应该能够恢复,但它似乎试图从 Jar 所在的旧节点而不是新节点获取类。有谁知道为什么 JVM 会出现这种行为?
最佳答案
JVM 仅打开文件一次,并保持句柄打开,以便在需要时从中读取类。当网络驱动器断开连接时,句柄将失效。
人们大概可以编写一个类加载器来尝试重新打开该文件并验证它确实与以前的文件相同,例如通过散列,但标准实现不会,因为文件系统被认为是可靠的。
从网络驱动器启动的大多数其他可执行程序可能会遇到类似的问题。
您应该使用不会使应用程序可见句柄无效的集群网络文件系统,而是透明地进行故障转移。
关于java - 为什么网络驱动器闪烁后 JVM 无法恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44876524/