网络驱动器轻弹后为什么JVM无法恢复?

时间:2017-07-03 01:03:31

标签: java jar jvm citrix

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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