У меня есть реализация в слое DAO, например:
@Cacheable(value = "features", cacheManager = "springCacheManager")
public List<Feature> getFeaturesFromProjectByRelease(UserDto userDto, int projectId, int releaseId, List<Integer> releasesList) {
//lets return a valid list with some random data, for simplicity I have returned a blank one here
return new ArrayList<Feature>();
}
У меня есть такая служба:
//Get all the features for projects and release
List<Feature> featureList = featureDao.getFeaturesFromProjectByRelease(userDto, projectId, releaseId, releasesList);
try {
this.refreshFeatureListCache(userDto, projectId, releaseId, releasesList);
} catch (InterruptedException e) {
logger.error("Cannot refresh 'features' cache");
e.printStackTrace();
}
@Async("asyncExecutor")
public CompletableFuture<List<Feature>> refreshFeatureListCache(UserDto userDto, int projectId, int releaseId, List<Integer> releasesList) throws InterruptedException {
return this.updateFeatureListInCache(userDto, projectId, releaseId, releasesList);
}
@CachePut(value = "features", cacheManager = "springCacheManager")
private CompletableFuture<List<Feature>> updateFeatureListInCache(UserDto userDto, int projectId, int releaseId, List<Integer> releasesList) {
List<Feature> featureList = featureDao.getFeaturesFromProjectByRelease(userDto, projectId, releaseId, releasesList);
return CompletableFuture.completedFuture(featureList);
}
У меня также работает служба исполнителя asyncExecutor.
Я не уверен, сработает ли вышеперечисленное.
Я ищу альтернативное решение, если оно не сработает, где я буду читать «featureList» из кэша, если он доступен, а затем сразу вызовите другую услугу ASYNCHRONOUSLY, которая обновит / обновит sh кеш путем фактического попадания в базу данных. Любые предложения по этому вопросу будут полезны!
РЕДАКТИРОВАТЬ: Добавление формулировки проблемы, чтобы лучше прояснить проблему:
- Получить данные из базы данных. Если запрос сделан в первый раз, тогда вызовите фактическую службу и кэшируйте данные.
- Если запрос сделан во второй раз вперед, извлеките данные из кэша, чтобы избежать длительного времени ожидания для внешнего интерфейса. пользователь. Как только запрос поступит из кеша, немедленно снова вызовите службу и обновите / обновите sh данные кеша, фактически вызвав метод обслуживания, требующий времени, АСИНХРОНИЗНО, чтобы пользователю не пришлось ждать с пользовательским интерфейсом состояния «зависание / загрузка».