Hystrix Collapser не работает (Javanica; SpringBoot) - PullRequest
0 голосов
/ 05 мая 2019

Я использую 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...