2016-03-10 25 views
5

Ho un chicco di primavera annotato con @Cacheable annotazioni definito in questo modoCome disattivare temporaneamente la cache per la cache primavera

@Service 
public class MyCacheableBeanImpl implements MyCacheableBean { 
    @Override 
    @Cacheable(value = "cachedData") 
    public List<Data> getData() { ... } 
} 

Ho bisogno di questo classe per essere in grado di disabilitare la cache e lavorare solo con i dati di fonte originale. Questo dovrebbe accadere sulla base di qualche evento dall'esterno. Ecco il mio approccio a questo:

@Service 
public class MyCacheableBeanImpl implements MyCacheableBean, ApplicationListener<CacheSwitchEvent> { 
    //Field with public getter to use it in Cacheable condition expression 
    private boolean cacheEnabled = true; 

    @Override 
    @Cacheable(value = "cachedData", condition = "#root.target.cacheEnabled") //exression to check whether we want to use cache or not 
    public List<Data> getData() { ... } 

    @Override 
    public void onApplicationEvent(CacheSwitchEvent event) { 
     // Updating field from application event. Very schematically just to give you the idea 
     this.cacheEnabled = event.isCacheEnabled(); 
    } 

    public boolean isCacheEnabled() { 
     return cacheEnabled; 
    } 

} 

La mia preoccupazione è che il livello di "magia" in questo approccio è molto alto. Non sono nemmeno sicuro di come posso verificare che funzioni (sulla base della documentazione di primavera dovrebbe funzionare, ma come esserne certi). Lo sto facendo bene? Se ho torto, allora come farlo bene?

+0

vedere qui: [ spring-boot-how-to-disable-cachable-during-development] (http://stackoverflow.com/questions/35917159/spring-boot-how-to-disable-cachable-during-development) –

+1

@ StefanIsele-prefabbricati .com attiva/disattiva la memorizzazione nella cache solo sui contesti tartaro. Il comportamento che voglio ottenere è che la memorizzazione nella cache possa essere disabilitata in qualsiasi momento in base a qualche evento esterno. – SimY4

risposta

3

Quello che cercavo era NoOpCacheManager:

Per farlo funzionare sono passato dalla creazione xml fagiolo per una fabbrica

ho fatto qualcosa come segue:

@Bean 
public CacheManager cacheManager() { 
    final CacheManager cacheManager;   
    if (this.methodCacheManager != null) { 
     final EhCacheCacheManager ehCacheCacheManager = new EhCacheCacheManager(); 
     ehCacheCacheManager.setCacheManager(this.methodCacheManager); 
     cacheManager = ehCacheCacheManager; 
    } else { 
     cacheManager = new NoOpCacheManager(); 
    } 

    return cacheManager; 
} 
+0

Bello. Questo non è esattamente ciò che è richiesto perché, ancora una volta, si sta creando un gestore di cache basato solo sulle condizioni di avvio e ho bisogno di attivare e disattivare la cache in fase di runtime. Ma questo mi ha dato un'idea, che posso creare il mio delegato di Cache Manager che sceglierà tra NoOp e CacheManager ordinario basato su uno stato volatile. In questo modo le annotazioni di Spring continueranno a funzionare e ottengo il controllo su come si comporterà il proxy della cache. – SimY4

Problemi correlati