Получение AWS S3 Client для работы в многопоточном коде - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь загрузить на S3 в моем асинхронном Java коде

private void submitCallablesWithExecutor () выбрасывает InterruptedException, ExecutionException, TimeoutException {

        ExecutorService executorService = null;

        try {
            executorService = Executors.newCachedThreadPool();

            Future<String> task1Future = executorService.submit(new Callable<String>() {

                public String call() {
                    try {
                        processExportRequest(xmlPutRequest_, customizedRequest_, response_);
                        return "Success";
                    } catch (Exception ex) {
                        return ex.getMessage();
                    }
                }
            });

        } finally {
            executorService.shutdown();

            try {
                if (!executorService.awaitTermination(800, TimeUnit.MILLISECONDS)) {
                    executorService.shutdownNow();
                }
            } catch (InterruptedException e) {
                executorService.shutdownNow();
            }
        }
    }

в пределах processExportRequest Я вызываю загрузку до S3. Я пробовал и S3Client и S3AsyncClient. В обоих случаях я получаю следующую ошибку:

Не удалось загрузить на S3: java .lang.IllegalStateException: прервано ожидание для обновления sh значения.

Я не Посмотрите где-нибудь в моем коде, который вызывает Thread.interrupt (), и все остальное, кажется, работает нормально, только не загрузка S3. Может быть, многопоточная природа Java Future не совместима с AWS SDK? Благодаря.

1 Ответ

0 голосов
/ 27 января 2020

Я изменил Future на CompletableFuture и объединил два из них (в последовательности):

private CompletableFuture<PutObjectResponse> processExportAndUploadAsync()
            throws IOException {
        CompletableFuture<PutObjectResponse> result = processExportAsync()
                .thenCompose(fileName -> uploadS3Async(fileName));

        return result;
    }

Кажется, это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...