From 382a3e789b9113f1c644de559f72c01aa8383842 Mon Sep 17 00:00:00 2001 From: TINO M THOMAS Date: Fri, 5 Oct 2018 20:20:49 +0300 Subject: [PATCH] BAEL -2251 Cache eviction in Spring Boot --- .../SpringBootMvcApplication.java | 4 ++ .../caching/CachingController.java | 17 ++++++ .../springbootmvc/caching/CachingService.java | 53 ++++++++++++++++++ .../CacheEvictAnnotationIntegrationTest.java | 44 +++++++++++++++ .../CacheManagerEvictIntegrationTest.java | 55 +++++++++++++++++++ 5 files changed, 173 insertions(+) create mode 100644 spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/caching/CachingController.java create mode 100644 spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/caching/CachingService.java create mode 100644 spring-boot-mvc/src/test/java/com/baeldung/caching/CacheEvictAnnotationIntegrationTest.java create mode 100644 spring-boot-mvc/src/test/java/com/baeldung/caching/CacheManagerEvictIntegrationTest.java diff --git a/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/SpringBootMvcApplication.java b/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/SpringBootMvcApplication.java index df8f72f500..99f081c602 100644 --- a/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/SpringBootMvcApplication.java +++ b/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/SpringBootMvcApplication.java @@ -2,8 +2,12 @@ package com.baeldung.springbootmvc; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication +@EnableCaching +@EnableScheduling public class SpringBootMvcApplication { public static void main(String[] args) { diff --git a/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/caching/CachingController.java b/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/caching/CachingController.java new file mode 100644 index 0000000000..390759de9b --- /dev/null +++ b/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/caching/CachingController.java @@ -0,0 +1,17 @@ +package com.baeldung.springbootmvc.caching; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class CachingController { + + @Autowired + CachingService cachingService; + + @GetMapping("clearAllCaches") + public void clearAllCaches() { + cachingService.evictAllCaches(); + } +} diff --git a/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/caching/CachingService.java b/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/caching/CachingService.java new file mode 100644 index 0000000000..e291640bd8 --- /dev/null +++ b/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/caching/CachingService.java @@ -0,0 +1,53 @@ +package com.baeldung.springbootmvc.caching; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +public class CachingService { + + @Autowired + CacheManager cacheManager; + + public void putToCache(String cacheName, String key, String value) { + cacheManager.getCache(cacheName).put(key, value); + } + + public String getFromCache(String cacheName, String key) { + String value = null; + if (cacheManager.getCache(cacheName).get(key) != null) { + value = cacheManager.getCache(cacheName).get(key).get().toString(); + } + return value; + } + + @CacheEvict(value = "first", key = "#cacheKey") + public void evictSingleCacheValue(String cacheKey) { + } + + @CacheEvict(value = "first", allEntries = true) + public void evictAllCacheValues() { + } + + public void evictSingleCacheValue(String cacheName, String cacheKey) { + cacheManager.getCache(cacheName).evict(cacheKey); + } + + public void evictAllCacheValues(String cacheName) { + cacheManager.getCache(cacheName).clear(); + } + + public void evictAllCaches() { + cacheManager.getCacheNames() + .parallelStream() + .forEach(cacheName -> cacheManager.getCache(cacheName).clear()); + } + + @Scheduled(fixedRate = 6000) + public void evictAllcachesAtIntervals() { + evictAllCaches(); + } +} diff --git a/spring-boot-mvc/src/test/java/com/baeldung/caching/CacheEvictAnnotationIntegrationTest.java b/spring-boot-mvc/src/test/java/com/baeldung/caching/CacheEvictAnnotationIntegrationTest.java new file mode 100644 index 0000000000..dc50d48215 --- /dev/null +++ b/spring-boot-mvc/src/test/java/com/baeldung/caching/CacheEvictAnnotationIntegrationTest.java @@ -0,0 +1,44 @@ +package com.baeldung.caching; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.junit.Assert.assertThat; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.springbootmvc.SpringBootMvcApplication; +import com.baeldung.springbootmvc.caching.CachingService; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = {SpringBootMvcApplication.class, CachingService.class}) +public class CacheEvictAnnotationIntegrationTest { + + @Autowired CachingService cachingService; + + @Before + public void before() { + cachingService.putToCache("first", "key1", "Baeldung"); + cachingService.putToCache("first", "key2", "Article"); + } + + @Test + public void givenFirstCache_whenSingleCacheValueEvictRequested_thenEmptyCacheValue() { + cachingService.evictSingleCacheValue("key1"); + String key1 = cachingService.getFromCache("first", "key1"); + assertThat(key1, is(nullValue())); + } + + @Test + public void givenFirstCache_whenAllCacheValueEvictRequested_thenEmptyCache() { + cachingService.evictAllCacheValues(); + String key1 = cachingService.getFromCache("first", "key1"); + String key2 = cachingService.getFromCache("first", "key2"); + assertThat(key1, is(nullValue())); + assertThat(key2, is(nullValue())); + } +} diff --git a/spring-boot-mvc/src/test/java/com/baeldung/caching/CacheManagerEvictIntegrationTest.java b/spring-boot-mvc/src/test/java/com/baeldung/caching/CacheManagerEvictIntegrationTest.java new file mode 100644 index 0000000000..7f7921fbe5 --- /dev/null +++ b/spring-boot-mvc/src/test/java/com/baeldung/caching/CacheManagerEvictIntegrationTest.java @@ -0,0 +1,55 @@ +package com.baeldung.caching; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.junit.Assert.assertThat; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.springbootmvc.SpringBootMvcApplication; +import com.baeldung.springbootmvc.caching.CachingService; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = {SpringBootMvcApplication.class, CachingService.class}) +public class CacheManagerEvictIntegrationTest { + + @Autowired CachingService cachingService; + + @Before + public void before() { + cachingService.putToCache("first", "key1", "Baeldung"); + cachingService.putToCache("first", "key2", "Article"); + cachingService.putToCache("second", "key", "Article"); + } + + @Test + public void givenFirstCache_whenSingleCacheValueEvictRequested_thenEmptyCacheValue() { + cachingService.evictSingleCacheValue("first","key1"); + String key1 = cachingService.getFromCache("first", "key1"); + assertThat(key1, is(nullValue())); + } + + @Test + public void givenFirstCache_whenAllCacheValueEvictRequested_thenEmptyCache() { + cachingService.evictAllCacheValues("first"); + String key1 = cachingService.getFromCache("first", "key1"); + String key2 = cachingService.getFromCache("first", "key2"); + assertThat(key1, is(nullValue())); + assertThat(key2, is(nullValue())); + } + + @Test + public void givenAllCaches_whenAllCacheEvictRequested_thenEmptyAllCaches() { + cachingService.evictAllCaches(); + String key1 = cachingService.getFromCache("first", "key1"); + assertThat(key1, is(nullValue())); + + String key = cachingService.getFromCache("second", "key"); + assertThat(key, is(nullValue())); + } +}