/* ================================================================== * 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 com.jinhe.tss.core.cachepool.strategy.CacheStrategy; import com.jinhe.tss.core.exception.BusinessException; import com.jinhe.tss.core.util.BeanUtil; /** * <p> ObjectPoolListener.java </p> * * @author Jon.King 2007-1-4 */ public class ObjectPoolListener implements IPoolListener { public void dealwithPoolEvent(ObjectPoolEvent poolEvent) { IPool pool = poolEvent.getPool(); if(pool != null){ switch(poolEvent.getType()){ case ObjectPoolEvent.CHECKOUT: case ObjectPoolEvent.REMOVE: // 移除或者检出缓存项时的事件处理 break; case ObjectPoolEvent.CHECKIN: case ObjectPoolEvent.PUT_IN: synchronized(pool){ //唤醒pool对象休息室中可能休眠中的线程,包括cleaner线程(池为空的时候会休眠),checkout,remove等操作的等待线程 pool.notifyAll(); } checkPoolLimit(pool); break; case ObjectPoolEvent.MAX_POOL_LIMIT_EXCEEDED: pool.getArithmetic().destroy(pool.remove()); // 如果缓存池容量已超过极限,则启动移除销毁 break; case ObjectPoolEvent.MAX_POOL_LIMIT_REACHED: pool.purge(); // 如果缓存池容量已经到达极限,则启动缓存清理 break; case ObjectPoolEvent.POOL_RELEASED: break; case ObjectPoolEvent.STRATEGY_CHANGED_NORMAL: changeStrategyNormally(pool); break; case ObjectPoolEvent.STRATEGY_CHANGED_INITNUM_RISE: // 如果pool.getSize() < pool.getCacheStrategy().getInitNum() // 则补足不足的项,只对ObjectPool类型有效。 break; case ObjectPoolEvent.STRATEGY_CHANGED_SIZE_REDUCE: checkPoolLimit(pool); break; case ObjectPoolEvent.STRATEGY_CHANGED_RESET: resetPool(pool); break; default: throw new BusinessException("ObjectPoolEvent的type值错误,不存在该类型的事件!"); } } } private void resetPool(IPool pool) { pool.release(false); pool.init(); } private void checkPoolLimit(IPool pool){ int maxSize = pool.getCacheStrategy().getPoolSize().intValue(); //如果maxSize = 0则表示不限制池大小 if(maxSize > 0 ){ if(pool.getSize() == maxSize) pool.firePoolEvent(ObjectPoolEvent.MAX_POOL_LIMIT_REACHED); if(pool.getSize() > maxSize) pool.firePoolEvent(ObjectPoolEvent.MAX_POOL_LIMIT_EXCEEDED); } } private void changeStrategyNormally(IPool pool){ CacheStrategy c = pool.getCacheStrategy(); // 更新池中所有缓存项的生命周期 for(CacheableKey key : pool.listKeys()){ Cacheable item = (Cacheable) pool.getOldObject(key); if(item == null) continue; item.setCyclelife(c.getCyclelife().longValue()); } //重新设置缓存池的算法器和缓存项载入器 pool.setArithmetic((IArithmetic) BeanUtil.newInstanceByName(c.getArithmeticClass())); pool.setLoader((ICacheLoader) BeanUtil.newInstanceByName(c.getCacheLoaderClass())); //因为pool对象都是用Proxy代理的,无法判断到底是ObjectPool,还是SimplePool或其他, //调用里面的方法只能通过接口。所以如果需要调用IPool的实现类特有的方法,就必须为该方法单独定义接口。类似ICleaner if(pool instanceof ICleaner){ ((ICleaner)pool).initCleaner(); //重新初始化清除器 } } /* * 只要是ObjectPoolListener的实例,都返回true * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object o){ if(o instanceof ObjectPoolListener){ return this.getClass().getName().equals(o.getClass().getName()); } return false; } /* * 所有的ObjectPoolListener实例返回相同的hashCode * @see java.lang.Object#hashCode() */ public int hashCode(){ return 123456789; } }