Я пытаюсь включить автоматический выключатель 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» и не может использоваться для внутренних?
Надеется, что моя проблема ясна (потому что для меня довольно неясный :))
Заранее спасибо
Спасибо за вопрос !! я не смог его найти. Я также попытался изменить видимость метода для публики, но поведение такое же, если метод не вызывается напрямую, hystrix не запускается. Эта же среда упоминается в понравившемся выпуске, но решение не предоставляется (как я понял), мне интересно, можно ли измерить методы без аннотации HystrixCommand в google, я не нашел никакого руководства или примера. Прямо сейчас я разделил свой класс на три части и инструментальную гистрию, и все работает отлично, но все же я думаю, что этот подход для моего приложения немного переработан. – IlTera
Аннотации HystrixCommand - это просто упрощенная процедура, представленная Javanica. Если вам нужна большая гибкость, вы можете реализовать свою команду стандартным образом, то есть путем подкласса класса HystrixCommand https://github.com/Netflix/Hystrix/wiki/Getting-Started#hello-world –
@IlTera. Что вы имеете в виду «не вызваны напрямую»? Когда метод не будет вызван напрямую? – jrahhali