不调用Hystrix回退方法

时间:2016-12-18 16:22:20

标签: java spring spring-boot hystrix circuit-breaker

我正在尝试使用hystrix后备方法。 在localhost: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);
    }
}

5 个答案:

答案 0 :(得分:3)

两种方法(即实际和回退方法)都应该是公共的,并将这些方法移动到一个单独的类中,并使用@Component进行注释。

尝试一下,希望这有帮助。

答案 1 :(得分:1)

您的@HystrixCommand带注释的方法应该是公开的。 不确定回退方法,但我也会公开它。

答案 2 :(得分:0)

这是因为AOP。

Spring容器在注入bean时会注入方面可识别的bean。

应用户请求调用name()函数时,将调用方面感知Bean的方法,以便注释可用。

但是,在原始豆中将其封装在代理中之前,直接在this.getCustomerName()中调用name()会在原始bean上调用getCustomerName()。它不知道方面。因此,注释不起作用。

我对我的英语不好表示歉意。

答案 3 :(得分:0)

如果您添加了netflix-hystrix的依赖项并具有开发工具来在执行服务时获取更改,那么您也可以尝试停止和启动该服务。

答案 4 :(得分:0)

后备方法应该从另一个 bean 调用。问题是您正在从 RestController 调用回退方法。