본문 바로가기
IT/JAVA

Ehcache Event Listener

by 최고영회 2021. 9. 13.
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