amazon-web-services - S3AbortableInputStream : Not all bytes were read from the S3ObjectInputStream, 中止 HTTP 连接。仅读取 ObjectMetadata 时发出警告

标签 amazon-web-services amazon-s3 aws-sdk

我正在使用<aws.java.sdk>1.11.637</aws.java.sdk>使用 Spring boot 2.1.4.RELEASE。

代码:导致S3警告(这里我只能从S3Object访问getUserMetadata,而不是整个对象内容)

private Map<String, String> getUserHeaders(String key) throws IOException {
    Map<String, String> userMetadata = new HashMap<>();
    S3Object s3Object = null;
    try {
      s3Object = s3Client.getObject(new GetObjectRequest(bucketName, key));
      userMetadata.putAll(s3Object.getObjectMetadata().getUserMetadata());
    } finally {
      if (s3Object != null) {
        s3Object.close();
      }
    }
    return userMetadata;
  }

输出:每当 s3Object.close();被调用,然后我在控制台上看到带有以下消息的警告

{"msg":"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.","logger":"com.amazonaws.services.s3.internal.S3AbortableInputStream","level":"WARN","component":"demo-app"}

我对错误原因的调查:

我进一步检查了https://github.com/aws/aws-sdk-java/blob/c788ca832287484c327c8b32c0e2b0090a74c23d/aws-java-sdk-s3/src/main/java/com/amazonaws/services/s3/internal/S3AbortableInputStream.java#L173-L187它说如果 _readAllBytes() 不正确(在我的情况下,我使用 S3Object 只是为了获取用户元数据而不是整个流内容),那么总是会出现警告。

问题:

a) S3Object.close 如何导致调用 S3AbortableInputStream.close 正如我假设 S3Object.close https://github.com/aws/aws-sdk-java/blob/c788ca832287484c327c8b32c0e2b0090a74c23d/aws-java-sdk-s3/src/main/java/com/amazonaws/services/s3/model/S3Object.java#L222 内的代码仅调用 SdkFilterInputStream.close通过is.close();

b)当我只想使用 S3Object 来读取元数据而不是整个对象内容时,我应该如何摆脱这些警告。

最佳答案

也许尝试使用此 API 函数,旨在仅检索 S3 对象的元数据:

ObjectMetadata getObjectMetadata(GetObjectMetadataRequest getObjectMetadataRequest)
                          throws SdkClientException,
                                 AmazonServiceException

因此将您的代码更改为:

ObjectMetadata s3ObjectMeta = null;
s3ObjectMeta = s3Client.getObjectMetadata(new GetObjectMetadataRequest(bucketName, key));
userMetadata.putAll(s3ObjectMeta.getUserMetadata());

关于amazon-web-services - S3AbortableInputStream : Not all bytes were read from the S3ObjectInputStream, 中止 HTTP 连接。仅读取 ObjectMetadata 时发出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58319694/

相关文章:

amazon-web-services - (AWS/EC2/EBS) 为什么 "Delete on Termination"对于根设备默认为 true?

java - 将 BufferedImage 转换为 aws...rekognition.model.Image

Scala代码不获取s3文件

amazon-web-services - 使用 CloudFormation 模板创建的 S3 存储桶是否有 "requester pays"属性?

amazon-s3 - 无法从 S3 加载数据

amazon-web-services - 为什么我不能在 AWS Batch C++ SDK 中覆盖多节点并行作业的容器变量?

amazon-web-services - 有什么方法可以配置 Minio 服务器接受的签名版本吗?

java - 无法检索亚马逊凭据

amazon-web-services - CloudFormation cfn-init 表示用户数据脚本成功/失败

amazon-web-services - GlacierSelectNotAvailable : Glacier select retrievals are currently not available, 请稍后再试