S3 传输管理器需要大量时间来上传
S3 transfer manager takes huge time to upload
我正在通过传输管理器将我的应用程序对象上传到 s3。它工作正常,但在极少数情况下,300 KB 的对象大小需要 15 分钟。我只是在探索引入重试逻辑,这样我就可以在 30 秒后中止当前上传并重新提交。下面是我的代码
private static UploadResult put(
final AmazonS3 amazonS3,
final Supplier<PutObjectRequest> requestSupplier) throws Exception {
TransferManager tx = TransferManagerBuilder
.standard()
.withS3Client(amazonS3)
.build();
try {
Upload myUpload = tx.upload(requestSupplier.get());
return myUpload.waitForUploadResult();
} finally {
tx.shutdownNow(false);
}
}
我们能否有一些东西可以让我在 30 秒后暂停此上传请求,以便我可以重试。 waitForUploadResult 方法是一个阻塞调用,因此只能等待它完成才能对其进行任何操作。
提前致谢!
我找不到使上传请求超时的方法,所以我在执行程序中提交了它,因此等待部分在单独的线程中运行。下面是我的代码
private static UploadResult put(
final AmazonS3 amazonS3,
final Supplier<PutObjectRequest> requestSupplier) throws Exception {
TransferManager tx = TransferManagerBuilder
.standard()
.withS3Client(amazonS3)
.build();
ExecutorService ex = Executors.newSingleThreadExecutor();
Upload myUpload = tx.upload(requestSupplier.get());
try {
Future<UploadResult> f = ex.submit(() -> myUpload.waitForUploadResult());
return f.get(2, TimeUnit.MINUTES);
} catch (TimeoutException te) {
myUpload.abort();
throw new RuntimeException("S3 save operation timeout after 2 minutes. Aborted.", te);
} finally {
ex.shutdownNow();
tx.shutdownNow(false);
}
}
我正在通过传输管理器将我的应用程序对象上传到 s3。它工作正常,但在极少数情况下,300 KB 的对象大小需要 15 分钟。我只是在探索引入重试逻辑,这样我就可以在 30 秒后中止当前上传并重新提交。下面是我的代码
private static UploadResult put(
final AmazonS3 amazonS3,
final Supplier<PutObjectRequest> requestSupplier) throws Exception {
TransferManager tx = TransferManagerBuilder
.standard()
.withS3Client(amazonS3)
.build();
try {
Upload myUpload = tx.upload(requestSupplier.get());
return myUpload.waitForUploadResult();
} finally {
tx.shutdownNow(false);
}
}
我们能否有一些东西可以让我在 30 秒后暂停此上传请求,以便我可以重试。 waitForUploadResult 方法是一个阻塞调用,因此只能等待它完成才能对其进行任何操作。
提前致谢!
我找不到使上传请求超时的方法,所以我在执行程序中提交了它,因此等待部分在单独的线程中运行。下面是我的代码
private static UploadResult put(
final AmazonS3 amazonS3,
final Supplier<PutObjectRequest> requestSupplier) throws Exception {
TransferManager tx = TransferManagerBuilder
.standard()
.withS3Client(amazonS3)
.build();
ExecutorService ex = Executors.newSingleThreadExecutor();
Upload myUpload = tx.upload(requestSupplier.get());
try {
Future<UploadResult> f = ex.submit(() -> myUpload.waitForUploadResult());
return f.get(2, TimeUnit.MINUTES);
} catch (TimeoutException te) {
myUpload.abort();
throw new RuntimeException("S3 save operation timeout after 2 minutes. Aborted.", te);
} finally {
ex.shutdownNow();
tx.shutdownNow(false);
}
}