/* ==================================================================
* Created [2009-4-27 下午11:32:55] by Jon.King
* ==================================================================
* TSS
* ==================================================================
* mailTo:jinpujun@hotmail.com
* Copyright (c) Jon.King, 2009-2012
* ==================================================================
*/
package com.jinhe.tss.core.cachepool.container;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheException;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import org.apache.log4j.Logger;
import com.jinhe.tss.core.cachepool.Cacheable;
import com.jinhe.tss.core.cachepool.CacheableKey;
import com.jinhe.tss.core.exception.BusinessException;
/**
* <p> EhcachePool.java </p>
*
* 使用本类来缓存的对象的key,value必须继承Serializable,这是因为ehcache这么要求.
*
* @author Jon.King 2006-12-31
*/
public class EhcacheContainer extends AbstractPoolContainer {
protected Logger log = Logger.getLogger(this.getClass());
private Cache cache;
public EhcacheContainer(String name){
super(name);
try {
CacheManager.getInstance().addCache(name);
cache = CacheManager.getInstance().getCache(name);
} catch (IllegalStateException e) {
log.error("EhcachePool->EhcacheContainer:IllegalStateException!", e);
} catch (CacheException e) {
log.error("EhcachePool->EhcacheContainer:CacheException!", e);
}
}
public Cacheable get(Object key) {
checkKey(key);
try {
Element e = cache.get((Serializable) key);
if (e != null)
return (Cacheable) e.getValue();
} catch (IllegalStateException e) {
log.error("EhcachePool->get:IllegalStateException!", e);
} catch (CacheException e) {
log.error("EhcachePool->get:CacheException!", e);
}
return null;
}
public Cacheable put(Object key, Cacheable value) {
checkKey(key);
checkKey(value);
Element e = new Element((Serializable) key, (Serializable) value);
cache.put(e);
return value;
}
public Cacheable remove(Object key) {
Cacheable item = get(key);
checkKey(key);
cache.remove((Serializable) key);
return item;
}
@SuppressWarnings("unchecked")
public List<CacheableKey> getKeys() {
try {
return cache.getKeys();
} catch (IllegalStateException e) {
log.error("EhcachePool->getKeys:IllegalStateException!", e);
} catch (CacheException e) {
log.error("EhcachePool->getKeys:CacheException!", e);
}
return null;
}
public void clear() {
try {
cache.removeAll();
} catch (IllegalStateException e) {
log.error("EhcachePool->clear:IllegalStateException!", e);
}
}
private void checkKey(Object key){
if (!(key instanceof Serializable)) {
log.error("类" + key.getClass() + "没有实现Serializable接口,不能被EHCache缓存!");
throw new BusinessException("类" + key.getClass() + "没有实现Serializable接口,不能被EHCache缓存!");
}
}
public int size() {
try {
return cache.getSize();
} catch (Exception e) {
log.error("获取EHCache缓存的大小时失败!", e);
throw new BusinessException("获取EHCache缓存的大小时失败!", e);
}
}
public List<Cacheable> getValues() {
List<CacheableKey> keys = this.getKeys();
List<Cacheable> values = new ArrayList<Cacheable>();
for(CacheableKey key : keys){
Cacheable value = this.get(key);
values.add(value);
}
return values;
}
}