2017-07-03 7 views
0

Javaアプリケーションは、ネットワークドライブ上のJarから実行されています。なんらかの理由でJarファイルが使用できなくなった場合、期待どおりにNoClassDefFoundErrorが発生します。ネットワーク接続の例のように失われます。しかし、私が奇妙に感じるのは、アプリケーションがまだ完全にクラッシュし、Jarファイルがあるネットワークドライブでフェールオーバーが発生した場合には回復しないということです。ネットワークドライブのフリック後にJVMが復旧しないのはなぜですか?

フェイルオーバーは、ネットワークドライブは、それが唯一のフリック簡単には変更しないことを意味し、再びすぐに使用可能になったが、それは(インフラの連中はノードそれを呼び出す)内部の低レベルのドライブのいくつかの並べ替えを変更します。フェールオーバーが発生した後(ノードが変更された場合)、Citrixサーバーで実行されているアプリケーションに接続されたすべてのユーザーが同じ例外を受け取ります。

ネットワークドライブがオンラインに戻ると、JVMは復旧できるはずですが、Jarが見つかった古いノードから新しいノードではなく古いノードからクラスを取得しようとしているようです。誰でもJVMがこの動作を提示する理由を知っていますか?

+0

これは、JARファイルのロードを1回だけ試みます。これをローカルの一時ファイルにコピーします。 – EJP

+0

あなたのコメントをお寄せいただきありがとうございます。Jarファイルがローカルの一時ファイルにロードされている場合、ネットワークドライブが利用できなくなった場合にJavaアプリケーションがエラーを発生させることはありません。私が説明したシナリオは、Javaアプリケーションが実行されているときに発生します。つまり、Jarからポイントフェイルオーバーが発生するまで実行する必要があるすべてのメモリーを正常にロードしました。フェイルオーバーには約2秒かかります。同じネットワークドライブで使用できますが、内部の「ノード」は変更されています。ジャークラスがメモリにロードされているとアプリケーションが実行された後にネットワークエラーが発生するのは、ネットワークエラーの – alejob2k

+0

しかし、JARファイル*は*一時ファイルにロードすることはできません、*。* – EJP

答えて

0

JVMは一度だけファイルを開き、必要なときにそれからクラスを読み取るオープンハンドルを保持します。ネットワークドライブが切断されると、ハンドルは無効になります。

一つは、おそらく、例えば、ファイルを再度開くしようとすると、それは以前のように実際に同じファイルであることを確認するクラスローダを書くことができしかし、標準的な実装では、ファイルシステムが信頼できるものと仮定されているので、標準的な実装はしません。ネットワークドライブから起動

他のほとんどの実行可能プログラムは、同様の問題が発生する可能性があります。

あなたは、アプリケーションの可視ハンドルを無効にし、代わりに透過的にフェイルオーバーを実行していないクラスタリングネットワークファイルシステムを使用する必要があります。

+0

非常に便利な説明をありがとう! – alejob2k

関連する問題