2016-07-13 47 views
6

All'avvio app, ho inizializzato ~ 20 diversi cache:Come posso rimuovere la cache ALL in Spring Boot?

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

voglio ripristinare tutte la cache a un intervallo, per esempio ogni ora. Utilizzando un processo pianificato:

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

A meno che io sto leggendo la documentazione sbagliato, ma @CacheEvict mi impone di fornire in realtà il nome della cache che può ottenere disordinato.

Come è possibile utilizzare @CacheEvict per cancellare TUTTE le cache?

stavo pensando invece di usare @CacheEvict, ho solo un ciclo tra tutte le cache:

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

Invece di fare l'hacking di qualcosa insieme, perché non utilizzare un'implementazione corretta della cache come ehcache che supporta questo semplicemente configurando la cache. –

+0

avrei dovuto aggiungere la dichiarazione di non responsabilità: sì, questo è stupido/hacky ma deve essere fatto. – iCodeLikeImDrunk

+0

Vorrei optare per l'opzione 2, non provare a usare '@ CacheEvict' per questo, poiché non è stato progettato per questo, ma è comunque un trucco e probabilmente dovresti usare una tecnologia di caching adeguata. –

risposta

19

ho appena usato un'operazione pianificata per cancellare tutta la cache utilizzando il gestore della cache.

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

Ottiene il lavoro.

0

Sotto il metodo evictCache elabora fooCache utilizzando l'annotazione @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."); 
    } 
} 
Problemi correlati