3

私の状況は次のとおりIOUtilsです。ファイルのコピーに使用しています。次に、JSON メッセージを別のプログラムに送信して、「コピーをダウンロードできます」と伝えます。問題は、他のプログラムが「予期しない EOF ダウンロード アーティファクトを受信しました」というエラーを受け取る時間の約 25% です。

このエラーが発生するたびに、手動で再試行すると、エラーは発生しません。私の理論では、それIOUtils.copyはブロックされず、他のプログラムがファイルをダウンロードしようとしている間、OS はまだファイルを FS に書き込んでいます。IOUtils.copyOSがファイルの書き込みを完了するまで、強制的に、または他の機能的に同等のコードをブロックする方法はありますか? それとも私の理論は間違っていますか?私が使用しているコードは次のとおりです。

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 (最終版) です。

4

1 に答える 1

3

現在のコードは、ファイルの内容が書き込みのためにオペレーティング システムに渡されることのみを保証します。実際にディスクに書き込まれることを保証するものではありません。

ファイルが実際にディスクに書き込まれていることを確認するsync()には、次のように呼び出しFileDescriptorます。

fileOutputStream.flush();
fileOutputStream.getFD().sync();
于 2013-07-03T23:24:19.347 に答える