2016-07-13 11 views
6

Na starcie aplikacji, ja zainicjowany ~ 20 różnych buforów:Jak mogę usunąć WSZYSTKIE pamięci podręczne w Spring Boot?

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

Chcę zresetować całą pamięć podręczną w odstępie, powiedzmy co godzinę. Korzystanie z zaplanowanego zadania:

@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())); 
     } 
    } 
} 

ile Czytam docs źle, ale @CacheEvict wymaga ode mnie rzeczywiście dostarczyć nazwę cache, które mogą dostać się bałagan.

Jak mogę użyć @CacheEvict, aby wyczyścić WSZYSTKIE pamięci podręczne?

Myślałam zamiast korzystania @CacheEvict, po prostu pętli wszystkich skrytek:

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

Zamiast hackować coś razem, czemu nie użyć odpowiedniej implementacji pamięci podręcznej, takiej jak ehcache, która obsługuje tę konfigurację, po prostu konfigurując pamięć podręczną. –

+0

Powinienem dodać zastrzeżenie: tak, to jest głupie/hacky, ale to musi być zrobione. – iCodeLikeImDrunk

+0

Wybrałbym opcję 2, nie próbuj używać '@ CacheEvict', ponieważ nie została do tego zaprojektowana, ale nadal jest to hack i prawdopodobnie powinieneś użyć odpowiedniej technologii buforowania. –

Odpowiedz

19

Używałem zaplanowane zadanie, aby wyczyścić całą pamięć podręczną, korzystając z menedżera pamięci podręcznej.

@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()); 
    } 
} 

Wykonuje zadanie.

0

Poniżej evictCache Metoda eksmituje fooCache przy użyciu adnotacji @CacheEvict.

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."); 
    } 
}