异常后S3客户端连接泄漏

时间:2013-11-26 05:40:23

标签: amazon-web-services amazon-s3 connection-pooling resource-leak connection-leaks

我是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时,我都找不到关闭它的方法

关于如何关闭它的任何想法?或者我如何避免首先使用异常处理?

1 个答案:

答案 0 :(得分:1)

我看到你已经" //关闭了一切"但是如果没有发布实际代码,我无法判断您是否正在关闭已成功加载的S3Object。你确定那些不是泄漏的东西吗?添加finally块以关闭S3Object,或使用try-with-resouce块。似乎如果没有找到并加载S3Object那么它就不会泄漏。