Общая архитектура: У меня есть класс 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