为什么我们需要在 AWS S3 Java 客户端中 setReadLimit(int)

维卡斯

我正在研究 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 的作用是什么?它将如何有用?我应该怎么做才能避免这种异常?

维卡斯

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

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

InputStream readLimit 目的:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我们需要在Java中对ArrayList使用迭代器?

使用AWS S3 Java客户端获取目录和对象元数据

在Java中,为什么我们需要在布尔表达式中减去一些数字?

JAVA-ThreadPoolExecutor 为什么我们需要在recheck过程中判断execute函数中的worker数量?

为什么我们到底需要Java中的StringBuffer

为什么我们需要Java中的默认方法?

为什么我们需要纯<?>在Java中?

为什么我们需要Java中的Properties类?

为什么我们需要Java中的弱引用

如何关闭AWS S3客户端连接

AWS S3事件-客户端标识

访问客户端的 AWS S3 存储桶

AWS Lambda中的S3客户端初始化缓慢

在.NET Core中配置AWS S3客户端

Java中的AWS Lambda字节流客户端

什么是好的Amazon S3客户端?

尝试检索存储在 AWS S3 中的 mp3 文件并将其作为 Blob 加载到我的 React 客户端中......它不起作用

我们可以将客户端SMS响应保存在AWS Pinpoint的2向SMS中吗?

为什么我们需要Java中的用户定义的类加载器

使用客户端加密的AWS S3数据保护

AWS S3客户端竞争条件解决方案

用于连接到 s3 客户端的 aws 配置文件

Laravel 5 Amazon AWS S3错误:客户端错误:403 RequestTimeTooSkewed

如何将文件从AWS S3下载到客户端设备?

使用KMS的AWS S3客户端加密-区域被忽略

从 AWS S3 存储桶中删除对象时,我们需要提供完整的 URL 还是只需要提供 S3 存储桶中的文件名

从Java中的AWS S3映像获取内容类型

我们如何使用AWS / S3?

为什么我们需要force.on(d3中的'tick'..