我有一个在 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/