1

我对 AWS 开发工具包相当陌生

我正在尝试从 S3 获取文件,但该文件可能不存在,显然有一种简单的方法可以使用 Amazon S3 客户端进行检查,因此无论如何我都在尝试获取该对象,并在异常处理内部检查错误消息。等于(“noSuchKey”)。(我知道使用异常来控制这种流程不是最佳做法,但找不到更好的方法)

但是问题就变成了http pooling客户端导致资源泄漏,我找不到关闭它的方法。

这是代码:

    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 子句中,对象变为空,所以我不能真正关闭它。我也不能关闭它的任何输入流。日志给了我:

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

1

我看到您有“//关闭所有内容”但没有发布实际代码,我无法判断您是否正在关闭已成功加载的 S3Objects。你确定这些不是泄露的内容吗?添加 finally 块来关闭 S3Object,或使用 try-with-resouce 块。似乎如果没有找到并加载 S3Object,那么它就不会泄漏。

于 2014-04-03T17:49:47.613 回答