2016-07-13 8 views
6

auf app starten, ich initialisiert ~ 20 verschiedene Caches:Wie kann ich ALLEN Cache im Spring Boot entfernen?

@Bean 
public CacheManager cacheManager() { 
    SimpleCacheManager cacheManager = new SimpleCacheManager(); 
    cacheManager.setCaches(Arrays.asList(many many names)); 
    return cacheManager; 
} 

Ich möchte in einem Intervall alle den Cache zurückzusetzen, sagen jede Stunde. eine geplante Aufgabe ein:

@Component 
public class ClearCacheTask { 

    private static final Logger logger = LoggerFactory.getLogger(ClearCacheTask.class); 
    private static final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd hh:mm:ss"); 

    @Value("${clear.all.cache.flag}") 
    private String clearAllCache; 

    private CacheManager cacheManager; 

    @CacheEvict(allEntries = true, value="...............") 
    @Scheduled(fixedRate = 3600000, initialDelay = 3600000) // reset cache every hr, with delay of 1hr 
    public void reportCurrentTime() { 
     if (Boolean.valueOf(clearAllCache)) { 
      logger.info("Clearing all cache, time: " + formatter.print(DateTime.now())); 
     } 
    } 
} 

Wenn ich die Dokumente falsch bin zu lesen, aber @CacheEvict mich erfordert den Namen des Caches tatsächlich liefern, die chaotisch bekommen.

Wie kann ich @CacheEvict verwenden, um ALLE Caches zu löschen?

Ich dachte stattdessen @CacheEvict verwenden, ich habe gerade eine Schleife durch alle Caches:

cacheManager.getCacheNames().parallelStream().forEach(name -> cacheManager.getCache(name).clear()); 
+2

Anstatt etwas zusammen zu hacken, warum nicht eine ordnungsgemäße Cache-Implementierung wie ehcache verwenden, die dies durch einfaches Konfigurieren des Caches unterstützt. –

+0

Ich sollte den Disclaimer hinzufügen: Ja, das ist dumm/hacky, aber es muss getan werden. – iCodeLikeImDrunk

+0

Ich würde für Option 2 gehen, nicht versuchen, '@ CacheEvict' dafür zu verwenden, da es dafür nicht entworfen wurde, aber immer noch ist es ein Hack und Sie sollten wahrscheinlich stattdessen eine richtige Caching-Technologie verwenden. –

Antwort

19

Früher habe ich nur einen geplanten Task alle Cache-Manager mit dem Cache zu löschen.

@Component 
public class ClearCacheTask { 
    @Autowired 
    private CacheManager cacheManager; 

    @Scheduled(fixedRateString = "${clear.all.cache.fixed.rate}", initialDelayString = "${clear.all.cache.init.delay}") // reset cache every hr, with delay of 1hr after app start 
    public void reportCurrentTime() { 
     cacheManager.getCacheNames().parallelStream().forEach(name -> cacheManager.getCache(name).clear()); 
    } 
} 

Bekommt den Job erledigt.

0

Unten evictCache Methode evicts fooCache mit @ CacheEvict Annotation.

public class FooService { 

    @Autowired 
    private FooRespository repository; 

    @Cacheable("fooCache") 
    public List<Foo> findAll() { 
    return repository.findAll(); 
    } 

    @CacheEvict(value="fooCache",allEntries=true) 
    public void evictCache() { 
    LogUtil.log("Evicting all entries from fooCache."); 
    } 
}