2016-03-10 14 views
5

के लिए कैशिंग निष्क्रिय करने के लिए मैं एक वसंत सेम @Cacheable एनोटेशन के साथ एनोटेट तोको अस्थायी रूप से वसंत कैश

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

तरह परिभाषित मैं इस वर्ग की जरूरत है कैशिंग को अक्षम और मूल स्रोत से डेटा के साथ ही काम कर रहा करने में सक्षम होना चाहिए। यह बाहर से कुछ घटना के आधार पर होना चाहिए। यहां मेरा दृष्टिकोण है:

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

} 

मेरी चिंता यह है कि इस दृष्टिकोण में "जादू" का स्तर बहुत अधिक है। मुझे यह भी यकीन नहीं है कि मैं कैसे परीक्षण कर सकता हूं कि यह काम करेगा (वसंत दस्तावेज के आधार पर यह काम करना चाहिए लेकिन कैसे सुनिश्चित किया जाना चाहिए)। क्या मैं यह ठीक कर रहा हूँ? अगर मैं गलत हूं तो इसे सही कैसे बनाया जाए?

+0

यहाँ देखें: [ वसंत-बूट-कैसे-अक्षम-कैच करने योग्य-विकास के दौरान] (http://stackoverflow.com/questions/35917159/spring-boot-how-to-disable-cachable-during-development) –

+1

@ स्टीफनइसेले-प्रीफैबवेयर .com यह केवल संदर्भों पर कैशिंग को सक्रिय/निष्क्रिय कर देगा टार्ट अप जिस व्यवहार को मैं प्राप्त करना चाहता हूं वह यह है कि कुछ बाहरी घटनाओं के आधार पर कैशिंग को किसी भी समय अक्षम किया जा सकता है। – SimY4

उत्तर

3

मैं क्या देख रहा था NoOpCacheManager था:

यह काम मैं एक्सएमएल सेम निर्माण से एक कारखाने के रूप में निम्नानुसार

मैं कुछ किया पर स्विच करने के लिए:

@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

अच्छा। यह बिल्कुल ठीक नहीं है क्योंकि फिर से, आप केवल स्टार्टअप स्थितियों पर आधारित कैश प्रबंधक बना रहे हैं और मुझे रनटाइम पर कैश चालू और बंद करने की आवश्यकता है। लेकिन इसने मुझे एक विचार दिया, कि मैं अपना खुद का कैश प्रबंधक प्रतिनिधि बना सकता हूं जो इसमें कुछ अस्थिर स्थिति के आधार पर नोओपी और सामान्य कैशमैनेजर के बीच चुना जाएगा। इस तरह वसंत एनोटेशन काम करना जारी रखेंगे और मुझे कैश प्रॉक्सी व्यवहार करने के तरीके पर नियंत्रण प्राप्त होगा। – SimY4

संबंधित मुद्दे