1

私は AWS SDK にかなり慣れていません

S3 からファイルを取得しようとしていますが、そのファイルが存在しない可能性があり、明らかに Amazon 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 句内では、オブジェクトが 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..........

このメソッドを呼び出して catch 句を数回入力すると、サーバーが非常に遅くなります。これは、新しい PoolingClientConnectionManager が初期化されるたびに明らかに示されていますが、それを閉じる方法が見つかりません。

どうすれば閉じることができますか?または、そもそも例外処理を使用しないようにするにはどうすればよいですか?

4

1 に答える 1