【问题标题】:Not all bytes were read from the S3ObjectInputStream, aborting HTTP connection WARNING并非所有字节都从 S3ObjectInputStream 中读取,正在中止 HTTP 连接 警告
【发布时间】:2019-08-14 00:24:06
【问题描述】:

我正在尝试从 S3 读取一个非常大的文件(几乎 1 GB)。但是 getobject 无法读取文件并出现错误

警告:并非所有字节都从 S3ObjectInputStream 中读取,因此中止 HTTP 连接。这可能是一个错误,并可能导致次优行为。通过远程 GET 仅请求您需要的字节,或在使用后耗尽输入流。

我检查了一些帖子,发现 s3ObjectInputStream.abort() 可能会解决问题。但这仍然没有帮助。

    S3Object sourceS3Object = null;
    S3ObjectInputStream s3ObjectInputStream=null;
    InputStream reader = null;
    ObjectMetadata metadata = null;
    int retries = 10;

    while (retries > 0) {
        try {
            sourceS3Object = sourceS3Client.getObject(sourceS3Uri.getBucket(), sourceS3Uri.getKey());
            s3ObjectInputStream = sourceS3Object.getObjectContent();
            reader = new BufferedInputStream(s3ObjectInputStream);
        } catch (Exception readingException) {
            retries--;
            System.out.println(readingException);
            System.out.println(readingException.getStackTrace().toString());
            readingException.printStackTrace();

            if (s3ObjectInputStream != null) {
                s3ObjectInputStream.abort();
            }
            sourceS3Object = sourceS3Client.getObject(sourceS3Uri.getBucket(), sourceS3Uri.getKey());
            s3ObjectInputStream = sourceS3Object.getObjectContent();
        } finally {
            if (retries == 0) {
                System.out.println("Out of retries");
            }
        }
    }

对于较小的文件,复制成功,但对于较大的文件,它会给我这个警告

【问题讨论】:

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


    【解决方案1】:

    有点晚了,但有一个明显的问题需要解决。

    您需要从 catch (Exception readingException) { 块中删除这两行:

    sourceS3Object = sourceS3Client.getObject(sourceS3Uri.getBucket(), sourceS3Uri.getKey());
    s3ObjectInputStream = sourceS3Object.getObjectContent();
    

    这是因为当发生异常时,你这样做:

       ...
       s3ObjectInputStream = sourceS3Object.getObjectContent();
    

    然后再次循环。你的循环做的第一件事是一样的:

       ...
       s3ObjectInputStream = sourceS3Object.getObjectContent();
    

    所以您的程序会两次获取内容流,但只读取一次内容。您需要从 Exception 块中删除这两行:

    您的循环也将永远运行,我希望这意味着您只是为示例删除了一些代码。

    【讨论】:

      【解决方案2】:

      警告提到,文件在没有读取整个文件的情况下关闭。 在您的代码中提到,

       if (s3ObjectInputStream != null) {
                      s3ObjectInputStream.abort();
                  }
      

      s3ObjectInputstream 存储文件内容,它在没有读取整个文件的情况下被中止。所以代码应该是:

      if (s3ObjectInputStream == null) {
                      s3ObjectInputStream.abort();
                  }
      

      【讨论】:

      • 你正在对一个空对象调用 abort??
      猜你喜欢
      • 2018-01-19
      • 2020-02-07
      • 2020-03-01
      • 2018-06-20
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多