Аннотации Resilience4j и @timeLimiter для тайм-аута и отмены потока – CompletableFuture ⇐ JAVA
Аннотации Resilience4j и @timeLimiter для тайм-аута и отмены потока – CompletableFuture
Мне сложно отменить/прервать задачу CompletableFuture, поэтому на контроллере истекает время ожидания, но выполнение клиента не останавливается, даже если это занимает больше времени
Чего мне не хватает? чтобы иметь возможность отменить выполнение моего клиента по таймауту
У меня есть следующая услуга:
@TimeLimiter(name = "ly-service-timelimiter", FallbackMethod = "fallFn") @Bulkhead (name = «ly-service-bulkhead», FallbackMethod = «fallFn», type = Bulkhead.Type.THREADPOOL) @Override public CompletableFuture myMethod(запрос запроса) выдает исключение { пытаться { log.info("Служба MyMethod: {}", request); вернуть client.myMethod(запрос); } catch (RuntimeException e) { log.info("Исключение", запрос); выдать новое RuntimeException(e); } } Клиент
public CompletableFuture myMethod(Запрос запроса) { CompletableFuture будущее = новый CompletableFuture(); CompletableFuture.runAsync(() -> { если (future.isCancelled()) { log.info("МойМетод был отменен перед выполнением."); возвращаться; } пытаться { log.info("Обработка запроса", запрос); ThreadUtil.fakeRandomSleep(10000); // Имитация работы если (future.isCancelled()) { log.info("Обработка была отменена во время выполнения."); } еще { log.info("Маршрутизация завершена с TimeOut"); будущее.завершено (нуль); } } catch (Исключение е) { log.info("completeExceptionally......"); Future.completeExceptionally(e); } }); вернуть будущее; } Контроллер:
@GetMapping("/runTimeOut") public @ResponseBody String ExecutionSample() выдает ExecutionException, InterruptedException { log.info("Выполнить конечную точку таймаута"); Запрос запроса = Request.builder().build(); //Любой класс пытаться { myService.myMethod(запрос).get(); }catch (ExecutionException ex){ if(ex.getCause() экземпляр java.util.concurrent.TimeoutException){ log.info("Произошло исключение TimeoutException"); } вернуть «Не удалось»; } вернуть «ОК»; } Моя конфигурация:
resilience4j: переборка: конфиги: по умолчанию: максимальное количество одновременных вызовов: 2 максимальная продолжительность ожидания: 0 мс экземпляры: ly-сервис-переборка: базовая конфигурация: по умолчанию ограничитель времени: экземпляры: ly-service-timelimiter: таймаутПродолжительность: 900 мс отменить-работающее будущее: правда Мои библиотеки
org.springframework.boot spring-boot-starter-parent 3.1.2 ... org.springframework.boot spring-boot-starter-aop org.springframework.boot привод-стартер-пружина io.github.resilience4j resilience4j-spring-boot2 2.1.0
Мне сложно отменить/прервать задачу CompletableFuture, поэтому на контроллере истекает время ожидания, но выполнение клиента не останавливается, даже если это занимает больше времени
Чего мне не хватает? чтобы иметь возможность отменить выполнение моего клиента по таймауту
У меня есть следующая услуга:
@TimeLimiter(name = "ly-service-timelimiter", FallbackMethod = "fallFn") @Bulkhead (name = «ly-service-bulkhead», FallbackMethod = «fallFn», type = Bulkhead.Type.THREADPOOL) @Override public CompletableFuture myMethod(запрос запроса) выдает исключение { пытаться { log.info("Служба MyMethod: {}", request); вернуть client.myMethod(запрос); } catch (RuntimeException e) { log.info("Исключение", запрос); выдать новое RuntimeException(e); } } Клиент
public CompletableFuture myMethod(Запрос запроса) { CompletableFuture будущее = новый CompletableFuture(); CompletableFuture.runAsync(() -> { если (future.isCancelled()) { log.info("МойМетод был отменен перед выполнением."); возвращаться; } пытаться { log.info("Обработка запроса", запрос); ThreadUtil.fakeRandomSleep(10000); // Имитация работы если (future.isCancelled()) { log.info("Обработка была отменена во время выполнения."); } еще { log.info("Маршрутизация завершена с TimeOut"); будущее.завершено (нуль); } } catch (Исключение е) { log.info("completeExceptionally......"); Future.completeExceptionally(e); } }); вернуть будущее; } Контроллер:
@GetMapping("/runTimeOut") public @ResponseBody String ExecutionSample() выдает ExecutionException, InterruptedException { log.info("Выполнить конечную точку таймаута"); Запрос запроса = Request.builder().build(); //Любой класс пытаться { myService.myMethod(запрос).get(); }catch (ExecutionException ex){ if(ex.getCause() экземпляр java.util.concurrent.TimeoutException){ log.info("Произошло исключение TimeoutException"); } вернуть «Не удалось»; } вернуть «ОК»; } Моя конфигурация:
resilience4j: переборка: конфиги: по умолчанию: максимальное количество одновременных вызовов: 2 максимальная продолжительность ожидания: 0 мс экземпляры: ly-сервис-переборка: базовая конфигурация: по умолчанию ограничитель времени: экземпляры: ly-service-timelimiter: таймаутПродолжительность: 900 мс отменить-работающее будущее: правда Мои библиотеки
org.springframework.boot spring-boot-starter-parent 3.1.2 ... org.springframework.boot spring-boot-starter-aop org.springframework.boot привод-стартер-пружина io.github.resilience4j resilience4j-spring-boot2 2.1.0
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как «спать» до тех пор, пока не будет запрошено отмены тайм -аута или отмены
Anonymous » » в форуме C# - 0 Ответы
- 22 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Получение ошибки тайм-аута — увеличьте значение тайм-аута отправки при привязке.
Anonymous » » в форуме C# - 0 Ответы
- 62 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Получение ошибки тайм-аута — увеличьте значение тайм-аута отправки при привязке.
Anonymous » » в форуме C# - 0 Ответы
- 46 Просмотры
-
Последнее сообщение Anonymous
-