- 通过@HystrixCommand 来配置hystrix熔断的时候,超时时间设置的3秒,碰到了fallback method wasn’t found: fallback([class java.lang.Boolean]),配置的接口方法有个Boolean类型的参数,而fallbackMethod对应的熔断方法是无参的,代码如下所示:
@GetMapping("/fallback")
public Mono<String> fallback() {
return Mono.just("hystrix common, fallback");
}
@HystrixCommand(fallbackMethod = "fallback", commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
})
@GetMapping("/test/fallback")
public String index(@RequestParam(value = "isSleep", defaultValue = "true") Boolean isSleep) throws InterruptedException {
log.info("是否睡眠:{}, 开始时间是:{}", isSleep, LocalDateTime.now());
if (isSleep){
TimeUnit.SECONDS.sleep(6);
}
log.info("结束时间是:{}", LocalDateTime.now());
return "睡眠结束";
}
如图所示,postman请求
2. 再熔断方法添加参数
接着测试,如图所示,会出现如下错误
{
"timestamp": "2020-01-14T02:46:56.971+0000",
"path": "/test/fallback",
"status": 500,
"error": "Internal Server Error",
"message": "Incompatible return types. \nCommand method: public java.lang.String com.txzhang.springcloud.GatewayClientApplication.index(java.lang.Boolean) throws java.lang.InterruptedException;\nFallback method: public reactor.core.publisher.Mono com.txzhang.springcloud.GatewayClientApplication.fallback(java.lang.Boolean);\nHint: Fallback method 'public reactor.core.publisher.Mono com.txzhang.springcloud.GatewayClientApplication.fallback(java.lang.Boolean)' must return: class java.lang.String or its subclass"
}
这是因为熔断方法的返回值和被熔断方法的返回值不一样
- 修改熔断发方法的返回值为String
@GetMapping("/fallback")
public String fallback(Boolean isSleep) {
log.debug("参数 isSleep : {}", isSleep);
return "hystrix common, fallback";
}
测试如图所示,正常熔断了
总结:熔断方法的返回值和参数列表需和原方法一致