Можем ли мы добавить кешируемый метод весенней загрузки в метод кеширования по расписанию для безопасности приложения? - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь реализовать загрузку Spring с кэшированием.Я хочу кэшировать ответ метода, который при вызове 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();
        }

Это для безопасности приложений.Incase @Cacehable не может кешировать ответ, это не повлияет на приложение.Я согласен, что первый запрос после evict обязательно попадет внутрь аннотированного метода @Cacheable и добавится в кеш. Но нужно убедиться, что я придерживаюсь правильного подхода

Может кто-нибудь пролить свет на то, чтобымне будет полезно исправить

1 Ответ

0 голосов
/ 16 февраля 2019

Итак, я взглянул на источники.

@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, который использует это 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 перед выполнением операции удаления кэша с помощью вызова execute.

Поэтому ваш «тестовый» вызов не будет иметь реального значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...