/* ==================================================================
* 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;
import java.util.List;
import com.jinhe.tss.core.cachepool.container.IPoolContainer;
import com.jinhe.tss.core.cachepool.strategy.CacheStrategy;
/**
* <p> SimplePool.java
* </p><p> 缓存池接口,提供了基本的缓存功能,包括存、取、删除、清空、重新载入等
* </p><p> 缓存策略停用启用的控制用动态代理实现,涉及的操作有,getObject,putObject,check-out,check-in
* </p><p> 注:如果缓存池采用ehcache来存储对象,则key, value值必须继承Serializable接口
*
* @author Jon.King 2006-12-31
*/
public interface IPool {
/**
* 初始化池
*/
void init();
/**
* 获取池名称
*/
String getName();
/**
* 根据key值从缓存池中获取一个对象。<br>
* 如果获取不到,会自动调用loader.loadCacheObject(new TimeWrapper(key, null))来加载。<br>
* 所以如果实现了ICacheLoader的loadCacheObject方法,应用缓存的地方不需要再手动执行putObject。<br>
*
* 同时还要维护池的请求数、点击率的信息。<br>
*
* @param key
* @return
*/
Cacheable getObject(Object key);
/**
* 根据key值从缓存池中获取一个对象。<br>
* 因为getObject(Object key)方法会增加缓存项的点击率,所以实现本方法以供缓存池内部维护调用。<br>
*
* @param key
* @return
*/
Cacheable getOldObject(Object key);
/**
* 将对象放入到缓存池中
* @param key
* @param value
* @return
*/
Cacheable putObject(Object key, Object value);
/**
* 从缓存池中移除一个对象。
* @param key
* @return
*/
Cacheable removeObject(Object key);
/**
* 列举缓存池的所有缓存项
* @return
*/
List<Cacheable> listItems();
/**
* 列举缓存池的所有缓存项Key值
* @return
*/
List<CacheableKey> listKeys();
/**
* 刷新缓存,清除池中所有缓存项
*/
void flush();
/**
* 刷新缓存项目, 将对象重新载入缓存池中.</p><p>
* 该方法由各个具体应用到缓存池的应用自己继承ICacheLoader接口实现
* @param obj
* @return
* @throws PoolException
*/
Cacheable reload(Cacheable obj) throws RuntimeException ;
/**
* 返回池中对象的个数(对IObjectPool而言包括空闲状态的和check-out的)
*/
int getSize();
/**
* 返回空闲状态的对象
*/
IPoolContainer getFree() ;
/**
* 返回使用状态的对象
*/
IPoolContainer getUsing();
/************************************************************************************
********************** 定义池的释放以及缓存项销毁等操作 ********************************
************************************************************************************/
/**
* 销毁缓存项。</p><p>
* 本方法会在release缓存池的时候被调用。
* @param o
*/
void destroyObject(final Cacheable o);
/**
* 释放所有池中的连接,并且关闭池。
* @param
* 是否强制释放(true:强制销毁这些连接然后返回, fasle 等所有连接都返回再释放)
*/
void release(final boolean forced);
/**
* 异步释放所有池中的连接,并且关闭池。本方法立即返回,一个后台的线程将被创建出来来释放池中连接。
* @param
* 是否强制释放(true:强制销毁这些连接然后返回, fasle 等所有连接都返回再释放)
*/
void releaseAsync(final boolean forced);
/**
* 设置是异步还是同步销毁对象。
* 如果设置为true,那么之后每次销毁对象(过期的对象,或者是最终释放整个池)的时候,允许方法立即返回。
* 当销毁对象很耗费时间的情况下,这种方式将会非常有用。
*/
void setAsyncDestroy(boolean b);
/**
* 返回是否是异步销毁对象
*/
boolean isAsyncDestroy();
boolean isReleased();
/************************************************************************************
************************************ 监听器操作 ************************************
************************************************************************************/
/**
* 往事件通知列表里加入一个监听器
* @param x
*/
void addObjectPoolListener(IPoolListener x);
/**
* 从事件通知列表里移除指定监听器
* @param x
*/
void removeObjectPoolListener(IPoolListener x);
/**
* 根据事件类型触发事件
* @param eventType
*/
public void firePoolEvent(int eventType);
/************************************************************************************
************************************ 池扩展 **********************************
************************************************************************************/
/**
* 池点击率。(requests == 0) ? 0 : (((float)hits / requests) * 100f)</p><p>
* 请求时获取的连接可能是池中已存在的连接,亦或者是新建出来的连接。</p><p>
* 池点击率为这两者的比较,越大则说明池的机制越好,因为池的目的就是要尽可能的利用已创建的连接而不用去创建新的。
*/
float getHitRate();
long getRequests();
/**
* 将元素从free池中取出,放入using池中,并返回该元素。</p><p>
* 如果没有空置的元素可以获取,则一个新的元素将会创建出来,除非到了池的上限值。</p><p>
* 如果一个空置的元素是错误的,它将被移出对象池,将会重新获取另外一个元素出来。</p><p>
* 如果池中没有空置的元素且已经到达池的最大容量,本方法将在指定的时间内等待,</p><p>
* 期间如果有对象被check-in则返回该对象。
* @param timeout
* @return
* 池中的元素,如果没有可用对象返回null
* @exception PoolException
* 创建对象时出错则抛异常
*/
Cacheable checkOut(long timeout);
/**
* 将对象重新返回到空闲(free)队列中。</p><p>
* 将元素从using池中去除,放入using池中。</p><p>
* 如果对象不在using池中,则返回失败。</p><p>
* @param o
*/
void checkIn(Cacheable o);
/**
* 根据缓存池中缓存策略设定的访问规则来从free池中移除一个缓存项。</p><p>
* 本操作在check-out或者"缓存池溢出"的时候被调用。</p><p>
* 如果移除一个后缓存池还是溢出状态,则本方法将会被反复调用,直到缓存池的容量不溢出为止。</p><p>
* @return
* 池中的元素,如果没有可用对象返回null
*/
Cacheable remove();
/**
* 清除池中过期的对象。</p><p>
* 本方法将被cleaner线程调用来清理过期的对象。</p><p>
* 注意,当类似对门户树进行缓存的时候需要对匿名门户树始终进行缓存,应用需要特殊实现purge()方法来实现</p><p>
* 缓存池的清理工作,从而替代默认的清除方式。
* @return
* 如果清除后池为空,则返回false,否则true
*/
boolean purge();
/************************************************************************************
************************************ 设置池 **********************************
************************************************************************************/
/**
* 设置池的算法
* @param arithmetic
* @see com.jinpj.cachepool.extend.IArithmetic
*/
void setArithmetic(IArithmetic arithmetic);
IArithmetic getArithmetic();
/**
* 设置池中缓存项载入类
* @param arithmetic
* @see com.jinpj.cachepool.extend.IArithmetic
*/
void setLoader(ICacheLoader loader);
/**
* 修改对象的缓存策略信息
* @param strategy
*/
void setCacheStrategy(CacheStrategy strategy);
CacheStrategy getCacheStrategy();
}