S3AbortableInputStream:并非从S3ObjectInputStream读取所有字节

时间:2019-04-04 15:07:15

标签: scala amazon-web-services amazon-s3

我在执行s3 GET Object请求时收到此警告

WARN 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

我看着AmazonS3: Getting warning: S3AbortableInputStream:Not all bytes were read from the S3ObjectInputStream, aborting HTTP connection

我对需要做什么没有清晰的认识。

下面是我正在使用的代码段

 try {
    s3obj = s3Client.getObject(s3Bucket, objectSummary.getKey)
    val name = s3obj.getKey.substring(dirPath.length + 1)
    val filename = name.replace(".xml", "")
    endpoints += base_url + filename
  } catch {
    case e@(_: IOException |_ : JSONException | _: Exception) =>
      println(e)
  } finally {
    if (s3obj != null)
      s3obj.close()
  }

2 个答案:

答案 0 :(得分:0)

基本上它是做什么的,如果S3客户端在读取N个字节后尝试关闭InputStream而不完全用尽它,则会发出警告消息,因为他们需要关闭HttpRequest和基础的http连接并从连接中删除连接池。
这可能在以下情况下发生:
Web应用程序最初从S3读取数据,而S3 DataStore通常将数据缓存在本地文件系统中,并且在这种情况下,如果Web访问者断开了HTTP连接,因此如果Tomcat指示断开连接,则http处理线程将停止,结果InputStream将关闭。

请参考以下链接: https://docs.aws.amazon.com/AmazonS3/latest/dev/RetrievingObjectUsingJava.html

答案 1 :(得分:0)

如果添加

  s3obj.abort()

到您的异常块,它应该可以解决问题。看起来像这样:

  } catch {
    case e@(_: IOException |_ : JSONException | _: Exception) =>
      println(e)
      if (s3obj != null) {
        s3obj.abort()
      }
  } finally {
    if (s3obj != null)
      s3obj.close()
  }

AWS开发工具包的复杂性在于,它希望避免在不需要时通过常规close()操作来简化大量数据流的传输。