0

これは奇妙なものです。通常、最初のセーブ試行は機能します (あと 1 回試行できます)。
ただし、負荷が高い場合 (連続して多くの保存を行う場合)は、保存されたファイルが消えます。
「Thread.sleep」のコメントを外すと、エラーがキャプチャされます。それ以外の場合、検証は正常にパスします

public void save(Object key, T objToSave) throws FileNotFoundException, IOException {
    IOException ex = null;
    for (int i = 0; i < NUM_OF_RETRIES; i++) {
        try {
            /* saving */
            String filePath = getFilePath(key);
            OutputStream outStream = getOutStream(filePath);
            ObjectOutputStream os = new ObjectOutputStream(outStream);          
            os.writeObject(objToSave);
            os.close(); 

            /* validations warnings etc. */
            if (i>0){
                logger.warn(objToSave + "  saved on attamped " + i);
                /* sleep more on each fail */
                Thread.sleep(100+i*8);
            }

            //Thread.sleep(50);
            File doneFile = new File(filePath); 
            if (! (doneFile.exists())){
                logger.error("got here but file was not witten to disk ! id was" + key);
                throw new IOException();
            }
            logger.info("6. start persist " + key + " path=" + new File(filePath).getAbsolutePath() + " exists="+doneFile.exists());

            return;
        } catch (IOException e) {
            logger.error(objToSave + " failed on attamped " + i);
            ex = e;
        } catch (InterruptedException e) {          
            e.printStackTrace();
        }
    }
    throw ex;
}
4

1 に答える 1

0

これは Java ライターの問題ではありません。私はスレッドを明示的に使用していませんでしたが、私のテストでは、保存していたフォルダーを削除していました: Runtime.getRuntime("rm -rf saver_directory"); それが非同期であり、正確な削除と作成の時間がミリ秒単位で変化しているという難しい方法を見つけました。したがって、解決策は削除後に「スリープ」を追加することでした。正解は、削除に Java を使用し、ショートカットを作成しないことです;)

皆さん、ありがとうございました。

于 2012-07-20T12:28:59.760 に答える