我们可以在计划的缓存逐出方法内添加spring boot可缓存方法以确保应用程序安全吗?

时间:2019-02-16 00:02:49

标签: java spring-boot caching

我正在尝试实现可缓存的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内部   方法并添加到缓存中。但是需要确保我遵循了   正确的方法

有人可以给我一些启示,这样对我进行纠正

1 个答案:

答案 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执行高速缓存驱逐操作。

因此,您的“测试”调用没有实际意义。