Ждать ответа API, если таймаут возвращает ноль?

Ожидание от maven

<dependency>
    <groupId>org.awaitility</groupId>
    <artifactId>awaitility</artifactId>
    <version>3.0.0</version>
    <scope>test</scope>
</dependency>
   await().atMost(Duration.TEN_SECONDS)
        .pollInterval(Duration.ONE_HUNDRED_MILLISECONDS)
        .until(()-> My Rest Call with response);

Мне нужен способ, если истечет время ожидания, не будет выдано исключение (не знаю, выдает ли он ex после истечения времени ожидания), вместо этого верните null или верните ответ, если он существует. И я хочу избежать повторного вызова, если ответ не пуст в течение интервала времени ожидания (если это возможно).

Не знаю, почему я нахожу это сложным. :-)

Проверьте эту часть документации, чтобы узнать, поможет ли она: github.com/awaitility/awaitility/wiki/…

pringi 17.10.2022 12:00

вы можете просто обернуть свой вызов с помощью попытки поймать и обработать тайм-ауты. Awaitility не предназначена для удовлетворения таких потребностей.

Alexey R. 17.10.2022 16:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
177
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете просто использовать java.util.concurrent для того, что вы описали, не нужно ждать:

private Object invokeWithTimeout() {
        ExecutorService execService = Executors.newSingleThreadExecutor();
        Callable<Object> runWithTimeout = this::doYourThing; // Or your Lambda
        Future<Object> result = execService.submit(runWithTimeout);
        try {
            return result.get(10, TimeUnit.SECONDS); //Set your Timeout here
        } catch (TimeoutException | InterruptedException | ExecutionException e) {
            result.cancel(true);            
            return null;
        }
}

Это вернет результат из doYourThing() или ноль, если истекло время ожидания или произошло другое исключение.

Почти подходит. Чего я не вижу в вашем ответе, так это интервала вытягивания (что-то вроде свободного ожидания). Но завтра попробую это решение, надеюсь

Gaj Julije 20.10.2022 22:39

Другие вопросы по теме