我正在通过传输管理器将我的应用程序对象上传到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方法是一个阻塞调用,因此无法执行任何操作,但要等待它完成。
谢谢!
答案 0 :(得分:0)
我找不到使上传请求超时的方法,所以我在执行程序中提交了该请求,因此等待部分在单独的线程中运行。下面是我的代码
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);
}
}