S3 Transfer Manager занимает огромное время для загрузки - PullRequest
0 голосов
/ 03 декабря 2018

Я загружаю свои объекты приложения в s3 через диспетчер переноса.Он отлично работает, за исключением редких случаев, когда для объекта размером 300 КБ требуется 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 голосов
/ 05 декабря 2018

Мне не удалось найти способ тайм-аута запроса на загрузку, поэтому я отправил его исполнителю, поэтому ожидающая часть выполняется в отдельном потоке.Ниже мой код

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);
        }
    }
...