我正在尝试实现可缓存的Spring Boot。我想缓存作为ws调用的方法响应。
1)我可以根据要求实现缓存。
@Cacheable(cacheNames = "mycache", key = "#root.target.cacheKey")
public String myMethod() {
}
2)我每天计划在凌晨1点之后退出缓存。
@Scheduled(cron = "${1 AM}")
@CacheEvict(cacheNames = "mycache", key = "#root.target.CACHE_KEY")
public void clearCache() {
LOGGER("Cache eviction:: ");
}
这也很好。 我的问题是,在没有浏览器对@Cacheable批注方法的任何请求的情况下将其逐出后,是否可以将@Cacheable批注方法撤回,以确保应用程序安全?
@Scheduled(cron = "${1 AM}")
@CacheEvict(cacheNames = "mycache", key = "#root.target.CACHE_KEY")
public void clearCache() {
LOGGER("Cache eviction:: ");
myMethod();
}
这是为了确保应用程序安全。如果@Cacehable无法缓存 响应,不会影响应用程序。我同意首先 逐出后的请求肯定会进入带注释的@Cacheable内部 方法并添加到缓存中。但是需要确保我遵循了 正确的方法
有人可以给我一些启示,这样对我进行纠正
答案 0 :(得分:1)
所以,我正在查看源代码。
@CacheEvict
AspectJ pointcut
被定义为
/**
* Matches the execution of any public method in a type with the @{@link CacheEvict}
* annotation, or any subtype of a type with the {@code CacheEvict} annotation.
*/
private pointcut executionOfAnyPublicMethodInAtCacheEvictType() :
execution(public * ((@CacheEvict *)+).*(..)) && within(@CacheEvict *);
然后分组为一个更通用的
protected pointcut cacheMethodExecution(Object cachedObject) :
(executionOfAnyPublicMethodInAtCacheableType()
|| executionOfAnyPublicMethodInAtCacheEvictType()
|| ...
使用此advice
的{{1}}是pointcut
的建议,这意味着您可以检查方法调用的输入和输出值,并在需要时继续进行实际的调用
around
如您所见,方法实现是通过Object around(final Object cachedObject) : cacheMethodExecution(cachedObject) {
MethodSignature methodSignature = (MethodSignature) thisJoinPoint.getSignature();
Method method = methodSignature.getMethod();
CacheOperationInvoker aspectJInvoker = new CacheOperationInvoker() {
public Object invoke() {
try {
// Call your method implementation
return proceed(cachedObject);
}
catch (Throwable ex) {
throw new ThrowableWrapper(ex);
}
}
};
try {
// Evict cache, in your case
return execute(aspectJInvoker, thisJoinPoint.getTarget(), method, thisJoinPoint.getArgs());
}
catch (CacheOperationInvoker.ThrowableWrapper th) {
AnyThrow.throwUnchecked(th.getOriginal());
return null; // never reached
}
}
之前调用的,然后通过调用proceed
执行高速缓存驱逐操作。
因此,您的“测试”调用没有实际意义。