Я использую SpringBoot 2.1.4 с Java 11 и пытаюсь использовать Hystrix Collapser для объединения запросов в один запрос. Поскольку у меня есть SpringBoot, я использую аннотации Javanica, чтобы заставить это работать. Проблема в том, что в моем коде выполняется фактическое тело Collapser, а не batchMethod.
Запись - это метод getApplicationById
. Сначала он проверит, доступен ли результат в кеше, а если нет, вызовет предоставленную функцию. параметр k
является ключом, который в данном случае является id
.
От лямбда-вызова он переходит к методу 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;
}