TImoutexception с Guava кешем + Spring Data + Couchbase проиндексированный документ - PullRequest
0 голосов
/ 20 января 2019

Общая архитектура: У меня есть класс Guava Cache, в котором должны храниться результаты некоторых данных, хранящихся в Couchbase.

Доступ к документу осуществляется с помощью Spring Data, и для запрошенного документа есть индекс, поэтому он очень быстро возвращается, обычно за несколько миллисекунд.

Проблема: При первом перезапуске приложения Spring Boot доступ к хранилищу Spring Data получает TimoutException. Тем не менее, он работает, как и ожидалось, на втором запросе и после этого, до следующего перезапуска приложения.

Класс кэша:

private final CatsRepository catsRepository;
private LoadingCache<String, Map<String, Integer>> catsAsMapCache;

@PostConstruct
public void init(){
    catsAsMapCache = CacheBuilder.newBuilder()
            .maximumSize(1000)
            .expireAfterWrite(5, TimeUnit.MINUTES)
            .build(
                    new CacheLoader<String, Map<String, Integer>>(){
                        public Map<String, Integer> load(String key){
                            Cat cat = catsRepository.findFirstByCatId(key);
                            // do some cool stuff here and return a map
                        }
                    }
            );
}

Когда findFirstByCatId(...) вызывается впервые, он всегда получает Timeoutexception. Но со 2-го звонка и после этого работает отлично.

Исключение:

com.google.common.util.concurrent.UncheckedExecutionException: org.springframework.dao.QueryTimeoutException: java.util.concurrent.TimeoutException

1 Ответ

0 голосов
/ 23 января 2019

Я не знаю всех деталей, но я знаю, что Spring Data инициализирует библиотеки для доступа к Couchbase способом, который не блокирует остальную загрузку преднамеренно. Я предполагаю, что это может иметь какое-то отношение к начальному таймауту, так как первый запрос может пройти, в то время как происходит много событий.

Один вариант, есть ли способ выполнить bucket.ping() для кластера перед обслуживанием обычных запросов? Эта функция предназначена для проверки работоспособности и гарантирует, что все соединения созданы и т. Д. Это может быть сделано при инициализации или с использованием исполнительного механизма.

...