Резервный метод Hystrix не вызывается

Я пробую резервный метод hystrix. На локальном хосте: 8082 работает служба поддержки клиентов, которая возвращает имя клиента.

Если служба поддержки клиентов не работает, следует вызвать резервный метод. Но этого не происходит.

Ниже приведен фрагмент кода.

Пожалуйста, предложите.

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
@RestController
public class DemoHystrixApplication {

    @GetMapping("/")
    public String name() {
        String str = getCustomerName();
        return str;
    }

    @HystrixCommand(fallbackMethod = "getFallbackCustomerName")
    private String getCustomerName() {
        RestTemplate restTemplate = new RestTemplate();
        URI uri = URI.create("http://localhost:8082");
        return restTemplate.getForObject(uri, String.class);
    }

    private String getFallbackCustomerName() {
        System.out.println("coming inside fallback method");
        return "Resillient Customer";
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoHystrixApplication.class, args);
    }
}

person prranay    schedule 18.12.2016    source источник


Ответы (5)


Оба метода, то есть фактический и резервный методы, должны быть общедоступными и перемещать эти методы в отдельный класс и аннотировать его с помощью @Component.

Попробуйте, надеюсь, это поможет.

person David    schedule 18.12.2016
comment
зачем отдельный класс? - person ses; 19.12.2018
comment
@ses Это просто предложение разделить @ SpringBootApplication, @ Controller и @ Service/@ Component вместо всего кода в одном месте. Просто предложение по лучшей практике кодирования, так как в течение определенного периода времени в одном месте будет много кода, и им будет трудно управлять. - person David; 24.01.2019

Ваш аннотированный метод @HystrixCommand должен быть общедоступным. Не уверен насчет резервного метода, но я бы тоже сделал его общедоступным.

person Olivier Meurice    schedule 18.12.2016

Вы также можете попробовать остановить и запустить службу, если вы добавили зависимость netflix-hystrix и у вас есть инструменты разработчика для получения изменений во время выполнения службы.

person Camilo    schedule 14.08.2019

Это из-за АОП.

Контейнер Spring внедряет bean-компонент с учетом аспектов при внедрении bean-компонента.

Когда функция name() вызывается по запросу пользователя, вызывается метод компонента с учетом аспектов, поэтому аннотация работает.

Однако вызов this.getCustomerName() непосредственно внутри name() вызывает getCustomerName() на необработанном bean-компоненте до того, как он будет заключен в прокси. Он не знает аспекта. Поэтому аннотация не работает.

person umbum    schedule 30.07.2019

Резервный метод следует вызывать из другого компонента. Проблема в том, что вы вызываете резервный метод из RestController.

person emre avci    schedule 13.06.2021