SpringFramework DeferredResult и Hystrix - PullRequest
       6

SpringFramework DeferredResult и Hystrix

0 голосов
/ 12 ноября 2018

Мне было интересно, есть ли разница при использовании аннотации @HysterixCommand для метода, который возвращает DeferredResult поверх метода, который сразу возвращает объект? Вот пример моего кода

@HystrixCommand(fallbackMethod = "getAlertsFallbackMethod")
public DeferredResult<List<AlertsBodyVO>> getAlerts(String userId) {
    LOGGER.info("Entered getAlerts - userId:{}", userId);
    final DeferredResult<List<AlertsBodyVO>> alertsDeferredResult = new DeferredResult<>();

    try {
        String requestURI = alertsEndpoint + userId.toUpperCase();
        LOGGER.info("requestURI:{}", requestURI);

        HttpHeaders headers = buildHttpHeader(userName, password);
        LOGGER.info("headers:{}", headers);
        HttpEntity<String> request = new HttpEntity<>(headers);
        LOGGER.info("request:{}", request);
        ResponseEntity<AlertsResponseVO> responseEntity = syncRestTemplate.exchange(requestURI, HttpMethod.GET, request, AlertsResponseVO.class);
        LOGGER.info("responseEntity:" + responseEntity);

        List<AlertsBodyVO> alertsBodyList = Arrays.asList(responseEntity.getBody().getAlertsBody());
        alertsDeferredResult.setResult(alertsBodyList);

    } catch (final RestClientException rce) {
        LOGGER.error("ServiceImpl::getAlerts: failed for user__{}, --Cause::", userId, rce);
        ErrorResponseVO alertsResponse = new ErrorResponseVO();
        alertsResponse.setErrorMessage("ServiceImpl::getAlerts: failed for user__" + userId );
        alertsDeferredResult.setErrorResult(alertsResponse);
    }
    LOGGER.info("Exiting:{}", alertsDeferredResult);
    return alertsDeferredResult;
}

public DeferredResult<List<AlertsBodyVO>> getAlertsFallbackMethod(String userId) {
    final DeferredResult<List<AlertsBodyVO>> alertsDeferredResult = new DeferredResult<>();
    LOGGER.info("CircuitBreaker:Fallback method for getAlerts returning empty object::userId: {}",userId);
    return alertsDeferredResult;
}

Сразу после этой строки

 ResponseEntity<AlertsResponseVO> responseEntity = syncRestTemplate.exchange(requestURI, HttpMethod.GET, request, AlertsResponseVO.class)

Резервный метод вызывается через 1 секунду. Я вижу в журналах, что restTemplate завершается успешно.

Для Hysterix - я использую настройки по умолчанию, и это отлично работает для меня в других методах, которые возвращают объекты.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...