2012-11-27 49 views
0

我遇到了麻煩,最後一個文件完成其下載後掛起的Amazon S3下載,「鎖定」文件被刪除,因爲它「仍在使用中」仍由java應用程序,否則他們工作得很好。此外,進度看起來並沒有正確更新,因爲最大的文件只是說100次的進度,然後繼續下載,沒有任何進一步的更新,直到它完成,此時它在腳本掛起之前說「狀態:已完成」 。我的代碼如下:Amazon S3 Java下載掛在最後文件

private static void getTheS3File(String bucketName, String file, String projID, String fileType) throws Exception { 
    ProgressListener progressListener = new ProgressListener() { 
     int lastProg = 0; 
     public void progressChanged(ProgressEvent progressEvent) { 
      if (download == null) return; 

      int curProg = (int)download.getProgress().getPercentTransfered(); 
      if(curProg != lastProg) { 
       System.out.println(curProg); 
       lastProg = curProg; 
      } 

      switch (progressEvent.getEventCode()) { 
      case ProgressEvent.COMPLETED_EVENT_CODE: 
       System.out.println("State: " + download.getState()); 
       break; 
      case ProgressEvent.FAILED_EVENT_CODE: 
       try { 
        AmazonClientException e = download.waitForException(); 
        System.out.printf("Unable to download file from Amazon S3: " + e.getMessage(), "Error Downloading File", JOptionPane.ERROR_MESSAGE); 
       } catch (InterruptedException e) {} 
       break; 
      } 
     } 
    }; 
    File newFile = null; 
    GetObjectRequest request = new GetObjectRequest(bucketName, file).withProgressListener(progressListener); 
    if(fileType == "img") { 
     newFile = new File("/c:/test/" + projID + "/original.jpg"); 
    } else if(fileType == "txt") { 
     newFile = new File("/c:/test/" + projID + "/test.txt"); 
    } 
    download = tx.download(request,newFile); 
    //System.out.println("progress: " + download.getProgress().getPercentTransfered() + " State: " + download.getState()); 
} 

我非常砍死闢出的SDK附帶有GUI創建方法的下載版的亞馬遜S3傳輸進度樣本的樣本代碼,所以我很驚訝它甚至工作。對於Java而言,我並不是那麼棒,使用AWS API更糟糕,因此歡迎任何指針。

回答

0

我找到了掛起問題的解決方案。顯然tx =新的TransferManager(憑證);應該是tx =新的AmazonS3Client(證書);。我不確定轉賬經理是如何工作的,但我假設它掛起的原因是它沒有在完成時關閉連接,但這可能是整個其他主題...

+1

做了更多的挖掘和發現我對傳輸管理器的原始假設是非常正確的,它保持打開狀態,直到您通過** tx.shutDownNow()**關閉它,但只有在完成所有操作後纔會調用它,因爲它會留下部分文件如果在傳輸過程中調用shutDownNow()。 有趣的是,除非我詢問其他人,否則我無法找到答案。 – DGolberg

相關問題