我在执行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
我对需要做什么没有清晰的认识。
下面是我正在使用的代码段
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()
}
答案 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()操作来简化大量数据流的传输。