未调用Hystrix后备方法

问题描述 投票:0回答:7

我正在尝试 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);
    }
}
java spring spring-boot hystrix circuit-breaker
7个回答
4
投票

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

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


1
投票

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


1
投票

这是因为AOP。

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

当应用户请求调用

name()
函数时,会调用切面感知 bean 的方法,因此注释起作用。

但是,在

this.getCustomerName()
中直接调用
name()
会在原始 bean 被包装在代理中之前调用
getCustomerName()
。它不知道方面。因此,注释不起作用。


0
投票

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


0
投票

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


0
投票

你可以尝试这个,因为 HystrixComman 是方面

@Bean
@Primary
@Order(value= Ordered.HIGHEST_PRECEDENCE)
public HystrixCommandAspect hystrixAspect() {
    return new HystrixCommandAspect();
}

0
投票

@HystrixCommand 注解的方法应该是公共的。回退方法可以是私有的,也可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.