1

後,我是相當新的AWS SDKS3客戶端連接泄漏例外

我想從S3文件,但文件可能不存在,顯然有簡單的方法來檢查,與亞馬遜S3客戶端,所以我試圖得到該對象反正,並在異常處理我檢查錯誤message.equals(「noSuchKey」)。 (我知道使用異常來控制這樣的流量不是最佳實踐,但無法找到更好的方式)

但是,然後問題變成http池客戶端導致資源泄漏,我找不到方法來關閉它。

下面的代碼:

AWSCredentials myCredentials = new BasicAWSCredentials(myAccessKeyID, mySecretKey); 
    AmazonS3 s3Client = new AmazonS3Client(myCredentials) 
    S3Object object = null; 
    GetObjectRequest req = new GetObjectRequest(bucketName, fileName); 

    try{ 
     object = s3Client.getObject(req); 
     //the following line is not reached because of the exception 
     InputStream objectData = object.getObjectContent(); 
     //do something 
     //close everything 
    } catch(AmazonServiceException e){ 
     if(e.getErrorCode().equals("NoSuchKey")){ 
      //do something 
      //here the 'object' is null, I don't have a reference to call close -> resource leak 
     } 
     else{ 
      DebugLog.d(e); 
     } 
    } catch(IOException e){ 
     DebugLog.d(e); 
    } 

catch子句的對象變爲空裏面,所以我真的不能收我it..nor可以關閉它的任何輸入流。日誌給我:

423835 [java-sdk-http-connection-reaper] DEBUG org.apache.http.impl.conn.PoolingClientConnectionManager - Closing connections idle longer than 60 SECONDS 
483835 [java-sdk-http-connection-reaper] DEBUG org.apache.http.impl.conn.PoolingClientConnectionManager - Closing connections idle longer than 60 SECONDS 
repeat.......... 

如果我把這種方法,並進入catch子句多次,服務器變得非常慢,這是每一次新的PoolingClientConnectionManager初始化一個明確的指示,但我可以」 t找到一種方法來關閉它

關於如何關閉它的任何想法?或者我可以如何避免使用異常處理?

回答

1

我看到你有「//關閉所有東西」,但是沒有發佈實際的代碼,我不知道你是否關閉了成功加載的S3Objects。你確定這些不是什麼被泄露?添加一個finally塊來關閉S3Object,或者使用try-with-resouce塊。看起來,如果沒有找到S3Object並加載,那麼它不能泄漏。