В моем приложении-оболочке Springboot я использую RestTemplate для вызова другого микросервиса. Я интегрировал Hystrix, так что он открывает цепь только в случае тайм-аутов (ответы 4xx и 5xx должны быть распространены обратно, как есть). В альтернативном методе я хочу создать пользовательское исключение, которое должно быть обработано в совете контроллера. Но всякий раз, когда я делаю это, я получаю следующее исключение:
2019-11-02 21:17:47.060 ERROR 33096 --- [ HystrixTimer-2] c.n.h.c.javanica.command.GenericCommand : failed to processed fallback is the method: 'circuitBreakHandler'.
2019-11-02 21:17:47.071 ERROR 33096 --- [nio-8084-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.netflix.hystrix.exception.HystrixRuntimeException: custom-key timed-out and fallback failed.] with root cause
java.util.concurrent.TimeoutException: null
at com.netflix.hystrix.AbstractCommand.handleTimeoutViaFallback(AbstractCommand.java:997)
at com.netflix.hystrix.AbstractCommand.access$500(AbstractCommand.java:60)
Это мой код:
@HystrixCommand(ignoreExceptions = {HttpStatusCodeException.class}, commandKey = "custom-key", fallbackMethod = "circuitBreakHandler")
public SomeResponse productAvailability() {
ResponseEntity<SomeResponse> entity = restTemplate
.getForEntity("http://www.example.com", SomeResponse.class);
return entity.getBody();
}
SomeResponse circuitBreakHandler() throws CustomException {
log.error("Connection to path: {} broken.", "/api");
throw new CustomException("Connection to path: /api is broken.");
}
@ExceptionHandler(value = CustomException.class)
public ResponseEntity<ApiErrorResponse> handleConflict(CustomException ex) {
ApiErrorResponse errorResponse = ApiErrorResponse.builder()
.status(HttpStatus.INTERNAL_SERVER_ERROR.value())
.message(ex.getMessage())
.build();
log.error("Exception {}", ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
Свойства:
hystrix.command.custom-key.execution.isolation.thread.timeoutInMilliseconds=2000
hystrix.command.custom-key.circuitBreaker.errorThresholdPercentage=60
Ответ:
{
"timestamp": 1572709667078,
"status": 500,
"error": "Internal Server Error",
"message": "custom-key timed-out and fallback failed.",
"trace": "com.netflix.hystrix.exception.HystrixRuntimeException: custom-key timed-out and fallback failed.\r\n\tat com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:832)\r\n\tat com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:807)\r\n\tat rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onError(OperatorOnErrorResumeNextViaFunction.java:140)\r\n\tat rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87)\r\n\tat
}
Как мне достичь своей цели создания пользовательского исключения внутри запасного метода hystrix, если не удается установить соединение с другим микросервисом?