728x90
반응형
SMALL
Ehcache 를 사용할 때 cache 가 remove 되는 시점을 알고 싶은 경우가 있다.
ehcache v2 (2.10.9.2) 에서 cache 에 대한 event listener 를 통해 확인할 수 있는 방법을 정리 한다.
(ehcache v3 에 대해서는 예제 코드가 많은데 v2 에 대해서는 별로 없어서 정리한다.)
ehcache 사용하기
"cacheManager" 는 spring cache 에서 같은 이름이 있기 때문에 "ehCacheManager" 로 설정했다.
@Configuration
public class CacheConfigure {
@Bean(name="cacheManagerFactoryBean")
public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
EhCacheManagerFactoryBean bean = new EhCacheManagerFactoryBean();
bean.setConfigLocation(new DefaultResourceLoader().getResource("classpath:cache/ehcache.xml"));
return bean;
}
@Bean(name="ehCacheManager")
public EhCacheCacheManager cacheManager(EhCacheManagerFactoryBean cacheFactory) {
EhCacheCacheManager cacheManager = new EhCacheCacheManager();
cacheManager.setCacheManager(cacheFactory.getObject());
return cacheManager;
}
}
Spring cache 가 아닌 ehcache 로 loading 되었는지 확인
@Slf4j
@Component
public class CacheManagerChecker implements CommandLineRunner {
private final CacheManager cacheManager;
@Autowired
public CacheManagerChecker(@Qualifier("ehCacheManager") CacheManager cacheManager) {
this.cacheManager = cacheManager;
}
@Override
public void run(String... args) throws Exception {
log.info("\nCache manager is " + this.cacheManager.getClass().getName()+"\n");
}
}
ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false">
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
timeToIdleSeconds="1800"
timeToLiveSeconds="3600"
overflowToDisk="false"
/>
<cache name="test_cache"
maxElementsInMemory="1"
timeToIdleSeconds="1800"
timeToLiveSeconds="3600"
overflowToDisk="false"
>
<cacheEventListenerFactory class="com.example.tester.CacheEventFactory" />
</cache>
</ehcache>
CacheEventFactory 정의
@Component
public class CacheEventFactory extends CacheEventListenerFactory {
@Override
public CacheEventListener createCacheEventListener(Properties properties) {
return CacheEventHandler.INSTANCE;
}
}
Cache Event Listener 구현 - 간단히 로그로 확인
@Slf4j
@Component
public class CacheEventHandler implements CacheEventListener {
public static final CacheEventListener INSTANCE = new CacheEventHandler();
@Override
public void notifyElementRemoved(Ehcache ehcache, Element element) throws CacheException {
log.info("element removed {}", ehcache.getName());
}
@Override
public void notifyElementPut(Ehcache ehcache, Element element) throws CacheException {
log.info("element put {}", ehcache.getName());
}
@Override
public void notifyElementUpdated(Ehcache ehcache, Element element) throws CacheException {
log.info("element update {}", ehcache.getName());
}
@Override
public void notifyElementExpired(Ehcache ehcache, Element element) {
log.info("element expired {}", ehcache.getName());
}
@Override
public void notifyElementEvicted(Ehcache ehcache, Element element) {
log.info("element evicted {}", ehcache.getName());
}
@Override
public void notifyRemoveAll(Ehcache ehcache) {
log.info("element remove all {}", ehcache.getName());
}
@Override
public Object clone() throws CloneNotSupportedException {
return null;
}
@Override
public void dispose() {
}
}
간단한 Controller
- /data 호출 시 random 데이터 생성하여 반환
- /clear 호출 시 cache 제거
@Slf4j
@RestController
public class Controller {
private final TestService service;
@Autowired
public Controller(TestService service) {
this.service = service;
}
@GetMapping(value = "/data")
public ResponseEntity<String> getCache() {
log.info("get data");
return new ResponseEntity<>(service.getDataOfCached(), HttpStatus.OK);
}
@GetMapping(value = "/clear")
public ResponseEntity<Void> clearCache() {
service.clearCache();
return new ResponseEntity<>(HttpStatus.OK);
}
}
Cache 사용 서비스
@Slf4j
@Service
public class TestService {
@Cacheable(value = "test_cache", key = "0")
public String getDataOfCached(){
String str = String.valueOf(new Random().nextInt());
log.info("random text is {}", str);
return str;
}
@CacheEvict(value = "test_cache", allEntries = true)
public void clearCache(){
log.info("clear cache");
}
}
테스트 진행
1. EhCache 로 load 된것 확인
2. /data 호출 시 random text 생성 하고 ehcache 에 put 된것을 listener log 로 확인
3. 이후 /data 호출 시 random text 생성 하지 않고 캐싱된 데이터 반환 하는 것 확인
4. /clear 호출 시 cache remove 되는 것 listener log 로 확인
5. 다시 /data 호출 시 random text 생성 하고 ehcache 에 put 하는 것 확인
728x90
반응형
LIST
'IT > JAVA' 카테고리의 다른 글
java with cpulimit & visualvm 으로 확인 (0) | 2022.07.19 |
---|---|
CompletableFuture 를 이용한 Mybatis 쿼리 여러개 동시 수행 (0) | 2022.06.24 |
Java ProcessBuilder cd 로 이동 (0) | 2021.07.23 |
EventSource IE 처리 (Feat. Polyfill) (0) | 2021.05.07 |
Netty(6) - TCP Server with SSL (0) | 2021.02.19 |