Обновление кеша после каждого звонка в сервис весной - PullRequest
0 голосов
/ 26 марта 2020

У меня есть реализация в слое 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 кеш путем фактического попадания в базу данных. Любые предложения по этому вопросу будут полезны!

РЕДАКТИРОВАТЬ: Добавление формулировки проблемы, чтобы лучше прояснить проблему:

  1. Получить данные из базы данных. Если запрос сделан в первый раз, тогда вызовите фактическую службу и кэшируйте данные.
  2. Если запрос сделан во второй раз вперед, извлеките данные из кэша, чтобы избежать длительного времени ожидания для внешнего интерфейса. пользователь. Как только запрос поступит из кеша, немедленно снова вызовите службу и обновите / обновите sh данные кеша, фактически вызвав метод обслуживания, требующий времени, АСИНХРОНИЗНО, чтобы пользователю не пришлось ждать с пользовательским интерфейсом состояния «зависание / загрузка».

1 Ответ

0 голосов
/ 26 марта 2020

Я не знаю, сработает ли это, но если нет, вы можете очистить кеш вручную, а затем снова вызвать кешированный метод, например:

    public class ExampleService {

        private final CacheManager cacheManager;

        private final FeatureDAO featureDao;

        public ExampleService(CacheManager cacheManager, FeatureDAO featureDao) {
            this.cacheManager = cacheManager;
            this.featureDao = featureDao;
        }

        @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>();
        }

        @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);
        }

        private CompletableFuture<List<Feature>> updateFeatureListInCache(UserDto userDto, int projectId, int releaseId, List<Integer> releasesList) {
            Cache featuresCache = cacheManager.getCache("features");
            featuresCache.clear();
            List<Feature> featureList = featureDao.getFeaturesFromProjectByRelease(userDto, projectId, releaseId, releasesList);
            return CompletableFuture.completedFuture(featureList);
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...