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());
Anstatt etwas zusammen zu hacken, warum nicht eine ordnungsgemäße Cache-Implementierung wie ehcache verwenden, die dies durch einfaches Konfigurieren des Caches unterstützt. –
Ich sollte den Disclaimer hinzufügen: Ja, das ist dumm/hacky, aber es muss getan werden. – iCodeLikeImDrunk
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. –