2016-10-03 7 views
0

Я пытаюсь включить автоматический выключатель Hystrix в приложении весенней загрузки. Мое приложение представляет собой стандартную весеннюю загрузку 1.4.1 с приложением spring-cloud-hystrix v 1.2.0 с одним классом контроллера, который вызывает класс обслуживания с помощью метода «совокупности». Этот метод внутренне вызывает две службы, используя внутренние частные методы.Spring Hystrix не запускается во внутренних методах

Если я аннотировать «агрегат» метод с @HystrixCommand everithing работает отлично, но если аннотировать другие внутренние методы Hystrix, кажется, не срабатывать

Это мой класс обслуживания:

@Service 
public class AggregationService { 

    @Autowired 
    Service1 service1Client; 

    @Autowired 
    Service2 service2Client; 

    private static final String QUERY = "query"; 
    private static final Logger log = LogManager.getLogger(); 
    private final ObjectMapper objectMapper = new ObjectMapper(); 

    //@HystrixCommand(
    // fallbackMethod = "emptyResult", 
    // groupKey = "aggregation-service", 
    // commandKey = "aggregate") 
    public AggregationResponse aggregate(final AggregationParams params) 
      throws ApiException, IOException { 

     final String query = queryExplain(params); 
     final WrapperQueryBuilder wrappedQuery = QueryBuilders.wrapperQuery(query); 
     final SearchResponse aggregationResult = searchAggregation(params, wrappedQuery); 

     return toDtoResponse(aggregationResult.getAggregations().get(params.getAggregationField().name().toLowerCase())); 
    } 

    @HystrixCommand(
     fallbackMethod = "emptyAggregationResult", 
     groupKey = "aggregation-service", 
     commandKey = "searchAggregation") 
    private SearchResponse searchAggregation(final AggregationParams params, final WrapperQueryBuilder query) { 

     return ... do something with service 2 .... 
    } 

    // @HystrixCommand(
    //  fallbackMethod = "rethrowTimeoutException", 
    //  groupKey = "aggregation-service", 
    //  commandKey = "query-for-aggregation", 
    //  ignoreExceptions = TimeoutException.class) 
    private String queryExplain(final AggregationParams params) throws ApiException, IOException { 
     final String queryAsString = ... do something with service 1 .... 
    } 

    private String rethrowTimeoutException(final AggregationParams params, final Throwable e) { 
     log.error("On Hystrix fallback because of ", e); 
     return null; 
    } 

    private SearchResponse emptyAggregationResult(final AggregationParams params, final WrapperQueryBuilder query, final Throwable e) { 
     log.error("On Hystrix fallback because of ", e); 
     return null; 
    } 

} 

Мой метод контроллер:

@GetMapping("{field}") 
    @ResponseStatus(HttpStatus.OK) 
    public AggregationResponse aggregate(... some params ...) throws ApiException, IOException { 

... omissis .... 

     return aggregationService.aggregate(params); 

Мой класс конфигурация имеет следующие аннотации:

@Configuration 
@EnableHystrix 

Мои application.properties содержит:

hystrix.command.searchAggregation.execution.isolation.thread.timeoutInMilliseconds=1 
hystrix.command.searchAggregation.circuitBreaker.errorThresholdPercentage=10 
hystrix.command.queryExplain.execution.isolation.thread.timeoutInMilliseconds=1 
hystrix.command.queryExplain.circuitBreaker.errorThresholdPercentage=10 
hystrix.command.default.execution.timeout.enabled=true 

Я намеренно держал тайм-аут для изоляции исполнения 1 мс, чтобы поймать выполнение Hystrix.

Странная вещь, что только @HystrixCommand, помещенный в метод «aggergate», кажется, срабатывает, а другие не так, если я комментирую аннотацию сверху «aggregate», не запускается ошибка таймаута, если я раскомментирую аннотацию выдается «недостающее освобождение»

Я спрашиваю, что у меня отсутствует? Должен ли @HystrixCommand быть помещен только на метод «called» и не может использоваться для внутренних?

Надеется, что моя проблема ясна (потому что для меня довольно неясный :))

Заранее спасибо

ответ

1

Javanica использует HystrixCommandAspect аспекта для выявления методов аннотированных с HystrixCommand аннотацию, и кажется, что pointcut влияет только на общедоступные методы.

ОБНОВЛЕНИЕ: в связи с данной проблемой существует bug report.

+0

Спасибо за вопрос !! я не смог его найти. Я также попытался изменить видимость метода для публики, но поведение такое же, если метод не вызывается напрямую, hystrix не запускается. Эта же среда упоминается в понравившемся выпуске, но решение не предоставляется (как я понял), мне интересно, можно ли измерить методы без аннотации HystrixCommand в google, я не нашел никакого руководства или примера. Прямо сейчас я разделил свой класс на три части и инструментальную гистрию, и все работает отлично, но все же я думаю, что этот подход для моего приложения немного переработан. – IlTera

+0

Аннотации HystrixCommand - это просто упрощенная процедура, представленная Javanica. Если вам нужна большая гибкость, вы можете реализовать свою команду стандартным образом, то есть путем подкласса класса HystrixCommand https://github.com/Netflix/Hystrix/wiki/Getting-Started#hello-world –

+0

@IlTera. Что вы имеете в виду «не вызваны напрямую»? Когда метод не будет вызван напрямую? – jrahhali