并非所有字节都从S3ObjectInputStream中读取,从而中止HTTP连接

时间:2017-03-31 20:42:38

标签: aws-java-sdk

我最近不得不升级到aws-java-sdk 1.11.108。我有一个java程序,它将s3对象(大小为8到10 GB)下载到EC2框并将其作为流处理。这个程序已经工作了2年以上没有任何问题,但在更新到aws-java-sdk的最新版本后,我的文件下载在日志中中止了以下WARN消息(无例外)

WARN:com.amazonaws.services.s3.internal.S3AbortableInputStream - Not all bytes were read from the S3ObjectInputStream, aborting HTTP connection. This is likely an error and may result in sub-optimal behavior. Request only the bytes you need via a ranged GET or drain the input stream after use.

S3Object s3Obj = s3client.getObject(new GetObjectRequest(bucketName, s3FileName));
Reader reader = new BufferedReader(new InputStreamReader(new  GZIPInputStream(s3Obj.getObjectContent());

如果有人可以告诉我们为什么流静默地中止而没有抛出任何异常,我会很感激,以及使它工作的最佳方法是什么。

由于

2 个答案:

答案 0 :(得分:0)

  

ZIP存档在(冗余)中央目录结构中   结束,这样您就可以在不扫描的情况下列出存档的内容   通过整个事情。 Java的ZipInputStream实际上从未消耗过   来自底层流; getNextEntry()尽快返回null   因为它找到了中心目录的开头。   您可以尝试添加while(in.read()> = 0);在你被覆盖的关闭   读取到底层流末尾的方法?

https://github.com/aws/aws-sdk-java/issues/1111

答案 1 :(得分:0)

确保仅close()输入流一次。