Spring boot Cacheable annotation - как обновлять результаты при каждом запросе - PullRequest
0 голосов
/ 14 мая 2019

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

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

@Cacheable
private List<Product> listProducts(String orgCode, String channel, String userToken) {
  return externalService.listProducts(orgCode, channel, userToken);
}

Когда в мое приложение Spring поступает запрос, он вызывает метод listProducts 5 раз.Внешняя служба вызывается только один раз, а кэшированный результат используется для остальных 4 вызовов.

Теперь приходит другой запрос и снова вызывает listProducts.Ранее кэшированный результат возвращается.Однако, поскольку это новый запрос к моему приложению, я хочу обновить результаты.

Я чувствую, что @Cacheable имеет параметр для этого, который я просто не могу найти.

1 Ответ

0 голосов
/ 14 мая 2019

Наилучшим способом, вероятно, является создание веб-фильтра для очистки кэша. Посмотрите на @CacheEvict(allEntries=true), вы можете аннотировать другой метод и вызывать его в фильтре.

Фильтр может выглядеть так:

@Component
public class CacheEvictFilter implements Filter {

    private final MyService myService;

    public CacheEvictFilter(final MyService myService) {
        this.myService = myService;
    }

    @Override
    public void doFilter(
      ServletRequest request, 
      ServletResponse response, 
      FilterChain chain
    ) throws IOException, ServletException 
    {
        chain.doFilter(request, response);

        myService.evictProducts();
    }

    // other methods
}

Метод evictProducts может выглядеть следующим образом:

@CacheEvict(allEntries=true)
public void evictProducts() {
    log.info("Evicted all products")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...