S3AbortableInputStream: не все байты были прочитаны из S3ObjectInputStream, прерывая HTTP-соединение. Предупреждение при чтении только ObjectMetadata - PullRequest
0 голосов
/ 10 октября 2019

Я использую <aws.java.sdk>1.11.637</aws.java.sdk> с весенней загрузкой 2.1.4.RELEASE.

Код : что вызывает предупреждение S3 (Здесь я должен получить доступ только к getUserMetadata из S3Object, а невсе содержимое объекта)

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 только для getUserMetadata, а не для всего содержимого потока), тогда всегда будет предупреждение.

Вопросы :

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();

б) Как мне избавиться от этих предупреждений, когда я хочу использовать S3Object только для чтения метаданных, а не всего содержимого объекта.

1 Ответ

1 голос
/ 10 октября 2019

Возможно, попробуйте использовать эту функцию API, предназначенную для получения только метаданных для объекта S3:

ObjectMetadata getObjectMetadata(GetObjectMetadataRequest getObjectMetadataRequest)
                          throws SdkClientException,
                                 AmazonServiceException

Поэтому измените свой код на:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...