XMLファイルをNFSマウントされたファイルシステムに出力するJavaコードが少しあります。ファイルシステムがSamba共有としてマウントされている別のサーバーでは、30秒ごとに新しいXMLファイルをポーリングするプロセスが実行されています。新しいファイルが見つかった場合、そのファイルは処理され、バックアップファイルとして名前が変更されます。99%の確率で、ファイルは問題なく書き込まれます。ただし、バックアップファイルに部分的に書き込まれたファイルが含まれる場合があります。
他の人と話し合った結果、外部サーバーで実行されているプロセスが、ファイルの読み取り時にJava出力ストリームに干渉していると推測しました。彼らは、最初にタイプ.tempのファイルを作成し、ファイルの書き込みが完了した後に.xmlに名前を変更することを提案しました。一般的な業界慣行。変更後、名前の変更は毎回失敗します。
一部の調査では、NFSマウントされたファイルシステムで作業する場合、JavaファイルI/Oにバグがあることが判明しました。
Javaの達人を助けてください!この問題を解決するにはどうすればよいですか?
関連する情報は次のとおりです。
- 私のプロセスは、Solaris10で実行されているJava1.6.0_16です。
- マウントされたファイルシステムはNASです
- ポーリングプロセスを備えたサーバーは、Windows Server 2003 R2 Standard、ServicePack2です。
これが私のコードのサンプルです:
//Write the file
XMLOutputter serializer = new XMLOutputter(Format.getPrettyFormat());
FileOutputStream os = new FileOutputStream(outputDirectory + fileName + ".temp");
serializer.output(doc, os);//doc is a constructed xml document using JDOM
os.flush();
os.close();
//Rename the file
File oldFile = new File(outputDirectory + fileName + ".temp");
File newFile = new File(fileName + ".xml");
boolean success = oldFile.renameTo(newFile);
if (!success) {
// File was not successfully renamed.
throw new IOException("The file " + fileName + ".temp could not be renamed.");
}//if