Java 8 acceptEither CompletableFuture Пример - PullRequest
0 голосов
/ 08 октября 2018

Я новичок в Java 8 & в процессе изучения API CompletableFuture.У меня также есть требование, когда мне нужно сделать асинхронный вызов стороннего API, а затем подождать 7 секунд.Через 7 секунд продолжите мою фактическую обработку.Также мне нужно проверить, успешно ли завершился асинхронный вызов за эти 7 секунд.Если да, то Журнал Успешного ответа или если Асинхронный вызов завершился исключительно, тогда Журнал ошибочного ответа в моей базе данных.

CompletableFure<Void> thridPartyCallFuture = Async Call to Third Party API;

//Wait for 7 seconds

Мне не нужно извлекать какой-либо ответ от Стороннего вызова API, мне просто нужно сделать паузу для7 секунд.

И поэтому я попытался позвонить thridPartyCallFuture.get(7, TimeUnit.SECONDS);, но проблема в том, что когда я вызываю thridPartyCallFuture.isDone(), он всегда будет возвращать true, но в случае, если thridPartyCallFuture завершился исключительно, я не получузнать, что важно регистрировать сообщения об ошибках в БД.Давайте рассмотрим сценарий, когда сторонний API не работает, и наш вызов был выполнен исключительно.В этом случае isDone() вернет true, тогда как isCompletedExceptionally() вернет false.

Проверьте, успешно ли завершено thridPartyCallFuture, затем зарегистрируйте ответ об успешном выполнении в БД.

Проверьте, еслиthridPartyCallFuture завершился в исключительном порядке, затем запишите ответ об ошибке в БД.

Я пытался исследовать acceptEither, но не смог сделать это правильно.

Я узнал в Java 9 новыйвведен метод orTimeOut(int), но в Java 8 такого метода нет.

Любая помощь приветствуется!

Заранее спасибо.

1 Ответ

0 голосов
/ 09 октября 2018

Не уверен, почему вы хотите подождать 7 секунд, даже если результат вернулся раньше.Следующий код показывает, как обрабатывать проблемы с вызовом API.И вы правы, Java 9 намного лучше поддерживает тайм-ауты.

public static void main(String[] args) throws ExecutionException, InterruptedException {
    CompletableFuture<Result> completableFuture = CompletableFuture
            .supplyAsync(() -> {
                System.out.println("Making call to API...");
                //call API here and if call fails, throw exception
                //throw new RuntimeException("HTTP call failed");
                return new Result(true, "Done");
            })
            .handle((o, throwable) -> o.isSuccess() ? o : new Result(false, throwable.getMessage()));

    Executors.newSingleThreadScheduledExecutor()
            .schedule(() -> {
                        Result result = completableFuture.getNow(new Result(false, "Timeout"));
                        System.out.println("Log to DB: "
                                + result.isSuccess()
                                + result.getMessage());
                        //other application method calls here
                    }, 7, TimeUnit.SECONDS);
}

-

public class Result {
    private boolean success;
    private String message;

    public Result(boolean success, String message) {
        this.success = success;
        this.message = message;
    }
    //getters/setters
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...