【问题标题】:S3AbortableInputStream : Not all bytes were read from the S3ObjectInputStream, aborting HTTP connection. Warning when reading only ObjectMetadataS3AbortableInputStream :并非所有字节都从 S3ObjectInputStream 中读取,因此中止 HTTP 连接。仅读取 ObjectMetadata 时发出警告
【发布时间】:2020-02-07 17:00:47
【问题描述】:

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

代码:这会导致 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 仅通过 is.close(); 调用 SdkFilterInputStream.close

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

【问题讨论】:

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


    【解决方案1】:

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

    ObjectMetadata getObjectMetadata(GetObjectMetadataRequest getObjectMetadataRequest)
                              throws SdkClientException,
                                     AmazonServiceException
    

    所以把你的代码改成:

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

    【讨论】:

    • 我认为这是我正在寻找的确切解决方案。我是 AWS 新手,但没有任何借口,我为错过 API 文档而感到羞愧。
    • 没问题@ArunKumar,发生在我们最好的人身上。请不要忘记将此标记为已接受的答案。
    猜你喜欢
    • 2018-01-19
    • 2019-08-14
    • 2018-06-20
    • 2020-03-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多