6 Ocak 2020 Pazartesi

SpringCache CacheManager Arayüzü

Giriş
Şu satırı dahil ederiz
import org.springframework.cache.CacheManager;
Spring'e ismi cacheManager olan bir bean tanıtmak gerekir. Bu bean'i belirtilen isme sahip org.springframework.cache.Cache nesnesini döndürür.

CacheManager  aslında bir arayüz olduğu için bu arayüzü gerçekleştiren bir sürü sınıf var. Bunlardan birisini etkinleştirmek gerekir.

Direkt Bu Arayüzü Gerçekleştiren Sınıflar
1.1 ConcurrentMapCacheManager - Varsayılan Yöntem
Açıklaması şöyle
If you do not add any specific cache library, Spring Boot auto-configures a simple provider that uses concurrent maps in memory. When a cache is required, this provider creates it for you. The simple provider is not really recommended for production usage, but it is great for getting started and making sure that you understand the features. 
Bu sınıf altta ConcurrentHashMap kullanır
Örnek
Normalde bu koda gerek yok ancak kodlasaydık şöyle yaparız.
@Bean
CacheManager cacheManager() {
  return new ConcurrentMapCacheManager("keyCache");
}
1.2 SimpleCacheManager Yöntemi
SimpleCacheManager yazısına taşıdım.

1.3 EhCacheCacheManager Yöntemi
EhCache 2 için kullanılır. Örnek ver

1.4 Guava Yöntemi
GuavaCacheManager yazısına taşıdım.

1.4 Hazelcast
com.hazelcast.spring.cache.HazelcastCacheManager kullanılır. Bu sınıf ile 
com.hazelcast.cache.HazelcastCacheManager farklı. İkincisi JCache gerçekleştirimi

HazelcastCacheManager yazısına taşıdım.

2. JCache Standardını Gerçekleştiren Sınıflar
JCache Kullanımı yazısına taşıdım

2.1. EhCache 3
EhCache 3 yazısına taşıdım. 


2.3 Redis Yöntemi
SpringCache Redis Kullanımı yazısına taşıdım.

Metodlar
Örnek - Get ve Clear işlemleri
Get işlemleri için şöyle yaparız
@RestController
@RequestMapping("/caches")
public class CacheController {
  private final CacheManager cacheManager;
  @Autowired
  public CacheController(CacheManager cacheManager) {
    this.cacheManager = cacheManager;
  }
  // Get all cache names
  @GetMapping
  public Collection<String> getAllCacheNames() {
    return cacheManager.getCacheNames();
  }
  // Get a specific cache content by name
  @GetMapping("/{cacheName}")
  public Map<Object, Object> getCacheContent(@PathVariable String cacheName) {
    Cache cache = cacheManager.getCache(cacheName);
    if (cache != null) {
      return cache.asMap();
    } else {
      throw new CacheNotFoundException("Cache not found: " + cacheName);
    }
  }
  ...
}
Clear işlemleri için şöyle yaparız
// Clear a specific cache by name
@DeleteMapping("/{cacheName}")
public void clearCache(@PathVariable String cacheName) {
  Cache cache = cacheManager.getCache(cacheName);
  if (cache != null) {
    cache.clear();
  } else {
    throw new CacheNotFoundException("Cache not found: " + cacheName);
  }
}
@DeleteMapping("clearAllCaches")
public ResponseEntity<Void> clearAllCaches() {
  cacheManager
    .getCacheNames()
    .stream()
    .forEach(cacheName -> cacheManager.getCache(cacheName).clear());
}
Exception handling için aynı sınıfta şöyle yaparız
@RestController
@RequestMapping("/caches")
public class CacheController {
  ...
  // Exception handler for CacheNotFoundException
  @ExceptionHandler(CacheNotFoundException.class)
  public String handleCacheNotFoundException(CacheNotFoundException ex) {
    return ex.getMessage();
  }

  private static class CacheNotFoundException extends RuntimeException {
    public CacheNotFoundException(String message) {
      super(message);
    }
  }
}

getCache metodu
Açıklaması şöy
getCache metodu
Açıklaması şöyle
CacheManager.getCache() return org.springframework.cache.Cache object which contains actual data. org.springframework.cache.Cache has clear() method using that we can clear cache data.
Örnek
Şöyle yaparız
@Autowired
private CacheManager cacheManager;

Cache cache = cacheManager.getCache("numberCache");
int number = ...;
String cachedValue = cache.get(number, String.class);
Örnek
Şöyle yaparız
@Autowired 
private CacheManager cacheManager;               

// execure after every 30 min
@Scheduled(cron = "0 0/30 * * * ?")              
public void clearCacheSchedule(){
  for(String name:cacheManager.getCacheNames()){
    // clear cache by name
    cacheManager.getCache(name).clear();            
  }
}
getCacheNames metodu
Açıklaması şöyle
CacheManager.getCacheNames() return name of all caches which is stored internally by spring cache.
Şöyle yaparız.
@Autowired
private CacheManager cacheManager;

@EventListener()
public void onApplicationEvent(ContextStartedEvent event) {
  cacheManager.getCacheNames()
    .parallelStream()
    .forEach(n -> cacheManager.getCache(n).clear());
}

Hiç yorum yok:

Yorum Gönder