1

후 나는 AWS SDK에 비교적 새로운 해요S3 클라이언트 연결 누출 예외

내가 S3에서 파일을 얻기 위해 노력하고 있지만, 그 파일이 존재하지 않을 수도 있고 분명히하여 해당 확인하는 쉬운 방법이있다 아마존 S3 클라이언트, 어쨌든 그 개체를 얻으려고하고 예외 처리 내부에서 message.equals ("noSuchKey") 오류를 확인합니다. (나는 이러한 흐름을 제어하기 위해 예외를 사용하는 것이 가장 좋은 방법은 아니지만 더 좋은 방법을 찾을 수는 없다는 것을 알고있다.)

그러나 HTTP 풀링 클라이언트가 리소스를 유출하게하고 문제를 해결할 수 없다. 그것. 정말 it..nor 내가 입력의 스트림을 닫을 수 있습니다 닫을 수 있도록

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); 
    } 

객체가 null이된다 캐치 절 내부 :

여기에 코드입니다. 로그는 저를 제공합니다

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.......... 

내가 여러 번이 메서드를 호출하고 캐치 절을 입력 할 경우, '서버는 새로운 PoolingClientConnectionManager가 초기화 될 때마다 것을 명확한 표시가되는 매우 느려집니다,하지만 난 그냥 수 그것을 닫는 방법을 찾지 못했습니다.

어떻게 닫을 수 있습니까? 아니면 처음부터 예외 처리를 사용하지 않도록 할 수 있습니까?

답변

1

"모든 것을 닫으십시오"라고 표시되지만 실제 코드를 게시하지 않고 성공적으로로드 된 S3Object를 닫을 지 여부를 알 수 없습니다. 그게 유출 된 것이 아닌가? finally 블록을 추가하여 S3Object를 닫거나 try-with-resouce 블록을 사용하십시오. S3Object가 발견되지 않고로드되지 않으면 누설 될 수없는 것 같습니다.