错误见解
在有fallbackMethod回调方法的处理接口中使用了非阻塞式异步编程方法,结果导致了一个ClassCastException,说是com.netflix.hystrix.HystrixCommand 无法转换为java.util.concurrent.CompletableFuture。
@RequestMapping(value = "/{id}")
@HystrixCommand(fallbackMethod = "errorCallBack") //模仿没有这个数据时,服务降级
public CompletableFuture<String> findById(@PathVariable Integer id) {
return CompletableFuture.supplyAsync(() -> {
User user = userService.findOne(id);
//协议
Map<String, Object> map = new HashMap<>();
map.put("code", 1);
map.put("data", user);
System.out.println("map::::"+map);
return new Gson().toJson(map);
});
}
仔细思考下,发现其实在异步调用中是不会等待方法执行完毕的,所以这个时候就会触发
fallbackMethod回调函数,而这个时候异步处理获取的回调函数返回的HystrixCommand ,无法与CompletableFuture进行转换,产生异常。
处理方法
1.最坏的方法
不是用异步调用的方法,或者不使用回调
2.个人推荐的方法
把回调方法放在调用该方法的上一层,或者放在底层