Повторите запрос с CompletableFuture Java

У меня есть ситуация, когда мне нужно вызвать параллельные HTTP-запросы для получения данных. Я использовал CompletableFuture для получения данных, как показано ниже.

Generictype model = CompletableFuture.supplyAsync(() -> {
        return lookupService.fetchData(token);
    }, taskExecutor)

Проблема в том, что я передаю токен доступа, который имеет очень короткий период, скажем, 60 секунд после истечения срока его действия.

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

Как я могу справиться с ситуацией, когда срок действия токена истекает между параллельными вызовами.

Что я пытаюсь сделать, так это то, что когда срок действия токена доступа истекает, он создает исключение UnAuthorized 401.

Я пытаюсь поймать исключение в исключительном блоке CompletableFuture, как показано ниже.

Generictype model = CompletableFuture.supplyAsync(() -> {
    return lookupService.fetchData(token);
}, taskExecutor)
   .exceptionally(exception -> {
        String newToken = lookupService.getNewToken(token);
            model = lookupService.fetchData(newToken);
        return model;
    });

Когда я получаю исключение, оно входит в исключительный блок, но запрос не выполняется должным образом. Он отвечает ответом 302 SAMEORIGIN.

Это правильный способ справиться с этой ситуацией или есть ли другой способ, чтобы я мог повторить запрос, когда срок действия токена доступа истек?


person Ninad    schedule 10.11.2019    source источник
comment
Итак, рабочий процесс такой: выполнить запрос с токеном --› если токен активен, вызвать какой-нибудь сервис --› если нет, получить новый токен и повторить вышеописанные действия?   -  person Shankha057    schedule 10.11.2019
comment
@ Shankha057 Да, именно все вызовы выполняются параллельно. Если какой-либо запрос не удался, мне нужно получить новый токен и снова повторить этот запрос.   -  person Ninad    schedule 10.11.2019
comment
Я думаю, что код ответа, отличный от исключенного, не должен рассматриваться как фактическая ошибка, а просто как один из возможных результатов, и поэтому вы можете использовать метод handle и проверить ответ и проверить, является ли он действительным или нет, и в В таком случае выполните логику повторной попытки.   -  person Shankha057    schedule 10.11.2019
comment
Вы можете попробовать один из ответов на вопрос Повторить логику с CompletableFuture, так как вам кажется, что вам нужно похожий.   -  person Thomas Kabassis    schedule 10.11.2019
comment
@tomkab Спасибо, я посмотрю на это   -  person Ninad    schedule 10.11.2019