Spring Boot可缓存注释-如何在每个请求上刷新结果

时间:2019-05-14 00:24:28

标签: java spring spring-boot caching

我有一个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有一个我找不到的参数。

1 个答案:

答案 0 :(得分:0)

最好的方法可能是创建一个Web筛选器以清除缓存。查看@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")
}