2014-03-26 74 views
0

我正在使用AWS S3客戶端從S3(大約600MB左右)下載大文件。但在下載過程中,下載失敗,出現錯誤,如Socket closedPremature end of Content-Length delimited message bodyData received in non-data state: 6。錯誤消息不斷從一個失敗變爲另一個失敗。在一點研究上,似乎會出現這樣的問題,AmazonS3客戶端在輸入流被完全讀取和寫入之前得到垃圾回收。 https://forums.aws.amazon.com/thread.jspa?messageID=438171#方法退出前垃圾收集方法中的局部變量? :Java

這裏是代碼看起來像

public void retrieve(String bucket, String key, String localFile){ 
    AmazonS3 s3Client = createNewS3Client(); 
    S3Object object = s3Client.getObject(bucket, key); 

    InputStream inputStream = object.getObjectContent(); 
    OutputStream outputStream = new FileOutputStream(localFile); 

    //read bytes from inputstream and write to outputstream until EOF 
    writeBytes(inputStream, outputStream); 

    inputStream.close(); 
    outputStream.close(); 
} 

所以我的問題是 - 可以在上述方法中s3Client如果方法writeBytes需要較長時間才能完成被垃圾收集,然後才能完成並返回? writeBytes方法中沒有提及s3Client

回答

0

在這裏添加我的答案,實際上解決了問題。

什麼不工作: 爲了避免垃圾收集,我又增加了其使用s3Client對象末尾日誌語句。

正如人們在評論中所建議的,在課堂上製作s3Client是一種選擇,但我無法做出改變。這可能已經解決了這個問題。

什麼修復問題: 使用API​​ getObject(GetObjectRequest getObjectRequest, File destinationFile)。它負責流處理,從流中讀取內容並寫入文件。

0

不,它不能。你在棧上有一個可訪問的引用。

+0

這就是我的想法,但我似乎無法找到方法拋出異常的任何其他可能的解釋。 – RandomQuestion

+1

我不會那麼確定...代碼可能已經過優化,因爲在開始使用流之後,沒有提及s3Client,我相信沒有理由爲什麼它不能被gc化。只需在方法末尾添加一行,如's3Client.toString()',以強制JVM保留ref並查看是否有幫助。 – Renato

+0

這是個好主意。我會嘗試的。 – RandomQuestion