2016-03-10 15 views
5

mam fasola wiosna opatrzone adnotacjami @Cacheable zdefiniowane jak takJak tymczasowo wyłączyć buforowanie Spring cache

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

muszę tej klasy będzie w stanie wyłączyć buforowanie i pracuje tylko z danymi z oryginalnego źródła. To powinno się zdarzyć na podstawie jakiegoś zdarzenia z zewnątrz. Oto moje podejście do tego:

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

} 

Moim problemem jest to, że poziom „magii” w tym podejściu jest bardzo wysoka. Nie jestem nawet pewien, czy mogę przetestować, czy to działa (na podstawie wiosennej dokumentacji to powinno działać, ale jak się upewnić). Czy robię to dobrze? Jeśli się mylę, to jak to naprawić?

+0

zobaczyć tutaj: [ spring-boot-how-to-disable-cachable-in-development] (http://stackoverflow.com/questions/35917159/spring-boot-how-to-disable-placeable-during- development) –

+1

@ StefanIsele-prefabware .com to tylko aktywuje/dezaktywuje buforowanie w kontekście s tart się. Zachowanie, które chcę osiągnąć, polega na tym, że buforowanie może być w dowolnym momencie wyłączone na podstawie zdarzenia zewnętrznego. – SimY4

Odpowiedz

3

Co szukałem był NoOpCacheManager:

Aby działać przeszedłem od tworzenia xml fasoli do fabryki

zrobiłem coś w następujący sposób:

@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

Nice. Nie jest to dokładnie to, o co prosiliśmy, ponieważ ponownie tworzysz menedżera pamięci podręcznej bazując tylko na warunkach uruchamiania i muszę włączać i wyłączać pamięć podręczną w czasie wykonywania. Ale to dało mi pewien pomysł, że mogę stworzyć własnego delegata Cache Managera, który wybierze między NoOp a zwykłym CacheManager w oparciu o jakiś niestabilny stan w nim. W ten sposób adnotacje wiosenne będą nadal działać, a ja będę mieć kontrolę nad zachowaniem proxy pośredniczącego. – SimY4

Powiązane problemy