2016-03-10 21 views
5

Tôi có một đậu mùa xuân chú thích với @Cacheable chú thích định nghĩa như vậyLàm thế nào để tạm thời tắt bộ nhớ đệm cho mùa xuân nhớ cache

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

Tôi cần lớp này có khả năng vô hiệu hóa bộ nhớ đệm và chỉ làm việc với dữ liệu từ nguồn gốc. Điều này sẽ xảy ra dựa trên một số sự kiện từ bên ngoài. Đây là cách tiếp cận của tôi cho điều này:

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

} 

Mối quan tâm của tôi là mức "ma thuật" trong phương pháp này rất cao. Tôi thậm chí không chắc chắn làm thế nào tôi có thể kiểm tra rằng điều này sẽ làm việc (dựa trên tài liệu mùa xuân này nên làm việc nhưng làm thế nào để chắc chắn). Tôi làm đúng không? Nếu tôi sai thì làm thế nào để làm cho nó đúng?

+0

thấy ở đây: [ spring-boot-how-to-disable-cachable-trong khi phát triển] (http://stackoverflow.com/questions/35917159/spring-boot-how-to-disable-cachable-during-development) –

+1

@ StefanIsele-prefabware .com này sẽ chỉ kích hoạt/hủy kích hoạt bộ nhớ đệm trên ngữ cảnh tart lên. Các hành vi tôi muốn đạt được là bộ nhớ đệm có thể bị vô hiệu hóa bất cứ lúc nào dựa trên một số sự kiện bên ngoài. – SimY4

Trả lời

3

gì tôi đang tìm kiếm là NoOpCacheManager:

Để làm cho nó làm việc tôi chuyển từ việc tạo ra đậu xml để một nhà máy

tôi đã làm một cái gì đó như sau:

@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

Tốt. Đây không phải là chính xác những gì được yêu cầu bởi vì một lần nữa, bạn đang tạo một trình quản lý bộ nhớ đệm chỉ dựa trên các điều kiện khởi động và tôi cần phải bật và tắt bộ nhớ cache khi chạy. Nhưng điều này đã cho tôi một ý tưởng, rằng tôi có thể tạo đại diện Cache Manager của riêng mình sẽ chọn giữa NoOp và CacheManager thông thường dựa trên một số trạng thái dễ bay hơi trong đó. Bằng cách đó, chú thích Spring sẽ tiếp tục hoạt động và tôi sẽ kiểm soát cách proxy bộ nhớ cache sẽ hoạt động như thế nào. – SimY4

Các vấn đề liên quan