S3 Transfer Manager需要大量时间来上传

时间:2018-12-03 14:04:05

标签: amazon-web-services amazon-s3 awss3transfermanager

我正在通过传输管理器将我的应用程序对象上传到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方法是一个阻塞调用,因此无法执行任何操作,但要等待它完成。

谢谢!

1 个答案:

答案 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);
        }
    }