Android AWS s3 SDK下载抛出“Socket is closed”异常或提前终止

Android AWS s3 SDK下载抛出“Socket is closed”异常或提前终止,第1张

概述我正在尝试使用AWS Android SDK 1.0.4或1.0.3从S3下载对象. 这是我的代码: AmazonS3Client client = getConnection(userCredentials);S3Object obj = client.getObject(workspaceName, objectName);ObjectMetadata meta = obj.getObje 我正在尝试使用AWS Android SDK 1.0.4或1.0.3从S3下载对象.

这是我的代码:

AmazonS3ClIEnt clIEnt = getConnection(userCredentials);S3Object obj = clIEnt.getobject(workspacename,objectname);ObjectMetadata Meta = obj.getobjectMetadata();long size = Meta.getContentLength();logger.info("S3 object length: "+size);inputStream is = new BufferedinputStream(obj.getobjectContent());byte[] fragmentBytes = IoUtils.toByteArray(is);logger.info("Read bytes: "+ fragmentBytes.length);

这有时很少有效.大多数情况下,抛出“java.net.socketException:Socket is closed”或者没有报告错误,但只读取了部分对象.

注意,对于IoUtils.toByteArray(…)来说,BufferedinputStream不是必需的,如果它存在与否则没有区别.

在调试器中逐行单步执行代码时,似乎不会出现此问题.

这发生在我的AndroID 2.3.3设备和3.2设备上.它发生在WiFi和3G上.

有任何想法吗?

PS>这些物体大约250k

解决方法 问题是客户端正在收集垃圾.要修复它,您需要保持对S3ClIEnt的显式引用.

BUG的流程如下:

>该程序获得一个S3客户端
>程序从客户端获取S3对象.
>程序从s3Object获取一个inputStream,它通过客户端获取它.
>垃圾收集运行,由于没有对客户端的引用,它会收集Garbage,随机关闭inputStream.

IMO,亚马逊这是一个非常糟糕的错误.为什么S3对象输入流没有返回客户端的引用对我来说是一个谜.

以下是AWS论坛上的主题:https://forums.aws.amazon.com/thread.jspa?threadID=83326

总结

以上是内存溢出为你收集整理的Android AWS s3 SDK下载抛出“Socket is closed”异常提前终止全部内容,希望文章能够帮你解决Android AWS s3 SDK下载抛出“Socket is closed”异常或提前终止所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1121904.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存