Как сделать, чтобы резервный метод Hystrix вызывал Custom Exception? - PullRequest
0 голосов
/ 02 ноября 2019

В моем приложении-оболочке 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, если не удается установить соединение с другим микросервисом?

...