我正在将SpringBoot 2.1.4与Java 11一起使用,并且试图使用Hystrix Collapser将请求聚合为单个请求。因为我有SpringBoot,所以我使用Javanica注释使其工作。问题是我的代码正在运行实际的Collapser主体,而不是batchMethod。
该条目是getApplicationById
方法。这将首先检查结果在缓存中是否可用,如果不可用,将调用提供的函数。 k
参数是密钥,在本例中为id
。
从lambda调用转到getAppFromServer
方法,该方法将多个参数转换为Collapser的一个参数。然后调用崩溃器。
问题是我的代码停止,因为抛出了RuntimeException
,但是绝不应该到达代码的这一部分,因为Collapser应该调用batchMethod
。
我已经尝试将Future<Application>
更改为Observable<Application>
,但是并不能解决问题。我还尝试删除了缓存功能构造,并直接调用方法getAppFromServer
,但它没有解决。我还将Hystrix版本从1.5.12(SpringBoot依赖项)升级到1.5.18(最新Hystrix版本)。
这是我的代码:
@Override
public Application getApplicationById(String id, String user) {
return cache.get(id, k -> getAppFromServer(k, user));
}
@HystrixCollapser(scope = com.netflix.hystrix.HystrixCollapser.Scope.REQUEST, batchMethod = "getApplicationsByIds")
public Future<Application> getApplicationById2(RequestData data) {
throw new RuntimeException("This method body should not be executed");
}
@HystrixCommand(fallbackMethod = "fallbackGetApplicationsByIds")
public List<Application> getApplicationsByIds(List<RequestData> requestData) {
List<Application> result = null;
// Now make the HTTP call and make sure the result List<Application> is the same size as the original list.
// Actual code removed for readability.
return result;
}
Application getAppFromServer(String id, String user) {
var reqData = new RequestData(id, user);
var future = getApplicationById2(reqData);
Application result = null;
try {
result=future.get();
} catch (InterruptedException e) {
log.error("Interrupted while getting result:"+e.toString());
} catch (ExecutionException e) {
log.error("ExecutionException while getting result"+e.toString());
}
return result;
}