私の状況は次のとおりIOUtils
です。ファイルのコピーに使用しています。次に、JSON メッセージを別のプログラムに送信して、「コピーをダウンロードできます」と伝えます。問題は、他のプログラムが「予期しない EOF ダウンロード アーティファクトを受信しました」というエラーを受け取る時間の約 25% です。
このエラーが発生するたびに、手動で再試行すると、エラーは発生しません。私の理論では、それIOUtils.copy
はブロックされず、他のプログラムがファイルをダウンロードしようとしている間、OS はまだファイルを FS に書き込んでいます。IOUtils.copy
OSがファイルの書き込みを完了するまで、強制的に、または他の機能的に同等のコードをブロックする方法はありますか? それとも私の理論は間違っていますか?私が使用しているコードは次のとおりです。
private boolean archiveArtifact(String archivePath, String deployId, Artifact artifact) {
InputStream inputStream = null;
FileOutputStream fileOutputStream = null;
boolean successful = true;
try {
File archiveDir = new File(archivePath);
File deployDir = new File(archiveDir, deployId);
if (!deployDir.exists()) {
deployDir.mkdirs();
}
URLConnection connection = new URL(artifact.getJenkinsUrl()).openConnection();
inputStream = connection.getInputStream();
File output = new File(deployDir, artifact.getFileName());
fileOutputStream = new FileOutputStream(output);
IOUtils.copy(inputStream, fileOutputStream);
} catch (IOException e) {
successful = false;
logger.error(e.getMessage(), e);
} finally {
try {
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException e) {
successful = false;
logger.error(e.getMessage(), e);
}
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
successful = false;
logger.error(e.getMessage(), e);
}
}
return successful;
}
これを NFS にコピーしていることは注目に値するかもしれません。私は NFS について何も知らないことに注意してください。これは CentOS リリース 5.9 (最終版) です。