Как удалить весь кеш, а затем предварительно заполнить кеш?

Может кто-нибудь сказать мне, в чем проблема с реализацией ниже. Я пытаюсь удалить весь кэш, во-вторых, я хочу предварительно заполнить / заполнить кэш. Однако то, что я ниже, это только удаление обоих кешей, но не предварительное заполнение / заполнение кеша при выполнении двух методов. Любая идея?

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;

@Cacheable(cacheNames = "cacheOne")
List<User> cacheOne() throws Exception {...}

@Cacheable(cacheNames = "cacheOne")
List<Book> cacheTwo() throws Exception {...}

@Caching (
        evict = {
                @CacheEvict(cacheNames = "cacheOne", allEntries = true),
                @CacheEvict(cacheNames = "CacheTwo", allEntries = true)
        }
)
void clearAndReloadEntireCache() throws Exception
{
    // Trying to reload cacheOne and cacheTwo inside this method
    // Is this even possible? if not what is the correct approach?
    cacheOne();
    cacheTwo(); 
}

У меня есть весеннее загрузочное приложение (v1.4.0), что более важно, используя следующие зависимости:

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
     <groupId>org.ehcache</groupId>
     <artifactId>ehcache</artifactId>
     <version>3.3.0</version>
 </dependency>
 <dependency>
     <groupId>javax.cache</groupId>
     <artifactId>cache-api</artifactId>
     <version>1.0.0</version>
 </dependency>

1 ответ

Если вы позвоните clearAndReloadEntireCache() метод, только этот метод будет обработан кэширующим перехватчиком. Вызов других методов того же объекта: cacheOne() а также cacheTwo() не вызовет перехват кэша во время выполнения, хотя оба они помечены @Cacheable,

Вы можете достичь желаемой функциональности, перезагрузив cacheOne и cacheTwo двумя вызовами методов, показанными ниже:

@Caching(evict = {@CacheEvict(cacheNames = "cacheOne", allEntries = true, beforeInvocation = true)},
        cacheable = {@Cacheable(cacheNames = "cacheOne")})
public List<User> cleanAndReloadCacheOne() {
    return cacheOne();
}

@Caching(evict = {@CacheEvict(cacheNames = "cacheTwo", allEntries = true, beforeInvocation = true)},
        cacheable = {@Cacheable(cacheNames = "cacheTwo")})
public List<Book> cleanAndReloadCacheTwo() {
    return cacheTwo();
}  
Другие вопросы по тегам