我有一个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
有一个我找不到的参数。
答案 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")
}