3

我正在尝试 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);
    }
}
4

5 回答 5

4

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

试一试,希望这会有所帮助。

于 2016-12-18T17:37:11.687 回答
1

这是因为 AOP。

Spring 容器在注入 bean 时会注入切面感知 bean。

当根据name()用户的请求调用该函数时,将调用切面感知 bean 的方法,因此注释起作用。

但是,在将原始 bean 包装在代理中之前,this.getCustomerName()直接在对原始 bean 的name()调用中进行调用。getCustomerName()它不知道方面。因此,注释不起作用。

于 2019-07-30T08:55:37.817 回答
1

您的 @HystrixCommand 注释方法应该是公开的。不确定后备方法,但我也会将其设置为公开。

于 2016-12-18T16:57:47.763 回答
0

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

于 2019-08-14T01:31:10.253 回答
0

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

于 2021-06-13T06:05:43.263 回答