gpt4 book ai didi

java - S3 Java 客户端多次失败,出现 "Premature end of Content-Length delimited message body"或 "java.net.SocketException Socket closed"

转载 作者:搜寻专家 更新时间:2023-10-30 21:04:26 25 4
gpt4 key购买 nike

我有一个在 S3 上做很多工作的应用程序,主要是从它下载文件。我看到了很多此类错误,我想知道这是否是我的代码中的错误,或者服务是否真的像这样不可靠。

我用来从 S3 对象流中读取的代码如下:

public static final void write(InputStream stream, OutputStream output) {

byte[] buffer = new byte[1024];

int read = -1;

try {

while ((read = stream.read(buffer)) != -1) {
output.write(buffer, 0, read);
}

stream.close();
output.flush();
output.close();
} catch (IOException e) {
throw new RuntimeException(e);
}

}

这个 OutputStream 是一个new BufferedOutputStream( new FileOutputStream( file ) )。我使用的是最新版本的 Amazon S3 Java 客户端,此调用在放弃之前重试了四次 次。因此,在尝试了 4 次之后仍然失败。

感谢任何关于我如何改进它的提示或技巧。

最佳答案

我刚刚设法克服了一个非常相似的问题。就我而言,我得到的异常是相同的;它发生在较大的文件上,但不会发生在小文件上,并且在单步执行调试器时根本不会发生。

问题的根本原因是 AmazonS3Client 对象在下载过程中被垃圾回收,导致网络连接中断。发生这种情况是因为我在每次调用加载文件时都构建了一个新的 AmazonS3Client 对象,而首选用例是创建一个持久的客户端对象,该对象在调用期间仍然存在 - 或者至少保证在整个调用过程中都存在下载。因此,简单的补救措施是确保保留对 AmazonS3Client 的引用,这样它就不会被 GC。

AWS 论坛上的一个链接对我有帮助:https://forums.aws.amazon.com/thread.jspa?threadID=83326

关于java - S3 Java 客户端多次失败,出现 "Premature end of Content-Length delimited message body"或 "java.net.SocketException Socket closed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9952815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com