【问题标题】:Spring boot Cacheable annotation -- how refresh results on every requestSpring Boot Cacheable 注解——如何刷新每个请求的结果
【发布时间】:2019-05-14 00:24:27
【问题描述】:

我有一个 Spring Boot 应用程序,它向外部 Web 服务发出大量请求。我在很多地方都使用@Cacheable 注释来缓存请求。我试图弄清楚如何在“每个请求”的基础上缓存请求。即:

假设我有以下调用外部服务的方法:

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

当一个请求进入我的 Spring 应用程序时,它会调用 listProducts 方法 5 次。外部服务只调用一次,缓存结果用于其他 4 次调用。

现在另一个请求进来了,并再次调用listProducts。返回之前缓存的结果。但是,由于这是对我的应用程序的新请求,我想刷新结果。

我觉得@Cacheable 有一个我找不到的参数。

【问题讨论】:

    标签: java spring spring-boot caching


    【解决方案1】:

    最好的方法可能是创建一个网络过滤器来清除缓存。看@CacheEvict(allEntries=true),可以注解另一个方法,在Filter中调用。

    过滤器可能如下所示:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 2020-02-17
      • 2017-05-22
      • 2023-03-22
      相关资源
      最近更新 更多