【问题标题】:Why we need to setReadLimit(int) in AWS S3 Java client为什么我们需要在 AWS S3 Java 客户端中设置读取限制(int)
【发布时间】:2019-09-01 22:04:45
【问题描述】:

我正在开发 AWS Java S3 库。

这是我使用 AWS 的高级 API 将文件上传到 s3 的代码。

        ClientConfiguration configuration = new ClientConfiguration();
        configuration.setUseGzip(true);
        configuration.setConnectionTTL(1000 * 60 * 60);
        AmazonS3Client amazonS3Client = new AmazonS3Client(configuration);
        TransferManager transferManager = new TransferManager(amazonS3Client);

        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentLength(message.getBodyLength());
        objectMetadata.setContentType("image/jpg");

        transferManager.getConfiguration().setMultipartUploadThreshold(1024 * 10);

        PutObjectRequest request = new PutObjectRequest("test", "/image/test", inputStream, objectMetadata);
        request.getRequestClientOptions().setReadLimit(1024 * 10);
        request.setSdkClientExecutionTimeout(1000 * 60 * 60);

        Upload upload = transferManager.upload(request);
        upload.waitForCompletion();

我正在尝试上传一个大文件。它工作正常,但有时我会遇到错误。我已将 readLimit 设置为 (1024*10)。

2019-04-05 06:41:05,679 ERROR [com.demo.AwsS3TransferThread] (Aws-S3-upload) Error in saving File[media/image/osc/54/54ec3f2f-a938-473c-94b7-a55f39aac4a6.png] on S3[demo-test]: com.amazonaws.ResetException: Failed to reset the request input stream;  If the request involves an input stream, the maximum stream buffer size can be configured via request.getRequestClientOptions().setReadLimit(int)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.resetRequestInputStream(AmazonHttpClient.java:1221)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1042)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:948)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:661)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:635)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:618)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$300(AmazonHttpClient.java:586)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:573)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:445)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4041)
    at com.amazonaws.services.s3.AmazonS3Client.doUploadPart(AmazonS3Client.java:3041)
    at com.amazonaws.services.s3.AmazonS3Client.uploadPart(AmazonS3Client.java:3026)
    at com.amazonaws.services.s3.transfer.internal.UploadCallable.uploadPartsInSeries(UploadCallable.java:255)
    at com.amazonaws.services.s3.transfer.internal.UploadCallable.uploadInParts(UploadCallable.java:189)
    at com.amazonaws.services.s3.transfer.internal.UploadCallable.call(UploadCallable.java:121)
    at com.amazonaws.services.s3.transfer.internal.UploadMonitor.call(UploadMonitor.java:139)
    at com.amazonaws.services.s3.transfer.internal.UploadMonitor.call(UploadMonitor.java:47)

readLimit 的作用是什么? 它将如何有用? 我应该怎么做才能避免这种异常?

【问题讨论】:

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


    【解决方案1】:

    在研究了 1 周后, 我发现如果您上传的文件大小小于 48GB,那么您可以将 readLimit 值设置为 5.01MB。

    因为 AWS 将文件分成多个部分,每个部分的大小为 5MB(如果您没有更改最小部分大小值)。根据 AWS 规范,最后一部分大小小于 5MB。所以我设置了 readLimit 5MB,它解决了这个问题。

    InputStream readLimit 用途:

    标记此输入流中的当前位置。对 reset 方法的后续调用将此流重新定位到最后标记的位置,以便后续读取重新读取相同的字节。Readlimit 参数告诉此输入流允许在标记位置无效之前读取那么多字节。 mark 的一般约定是,如果方法 markSupported 返回,则流以某种方式记住调用 mark 之后读取的所有字节,并准备好在调用方法 reset 时再次提供这些相同的字节。但是,如果在调用 reset 之前从流中读取的字节数超过 readLimit 字节,则流根本不需要记住任何数据。

    【讨论】:

      猜你喜欢
      • 2018-08-26
      • 2015-07-11
      • 2021-02-16
      • 2015-09-25
      • 1970-01-01
      • 2013-03-29
      • 2020-01-04
      相关资源
      最近更新 更多