/* ==================================================================
* 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.threadpool;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import com.jinhe.tss.core.cachepool.CacheManager;
import com.jinhe.tss.core.cachepool.Cacheable;
import com.jinhe.tss.core.cachepool.IPool;
import com.jinhe.tss.core.cachepool.TestCacheConstants;
import com.jinhe.tss.core.cachepool.extend.thread.IThreadPool;
import com.jinhe.tss.core.cachepool.proxy.profier.CGLIBProfiler;
import com.jinhe.tss.core.cachepool.proxy.profier.ProxyProfiler;
import com.jinhe.tss.core.cachepool.strategy.CacheConstants;
/**
* <p> PortScanner.java </p>
*
* 本测试类中因为Scanner的对象很小,从缓存中获取或是直接new 出来,差别并不大, </p><p>
* 所以尝试增长Scanner对象的生成时间,构造函数里 sleep(n)。 </p><p>
* 用CGLIBProfiler来测试fillInWorkQueue方法在上述两种不同情况下的效率。 </p><p>
* 池的关闭在缓存策略配置文件中设置,disabled(0:启用, 1:停用)。 </p><p>
* 另外性能调优还要考虑 "线程池" 方面。
*
* @author Jon.King 2007-1-8
*/
public class PortScanner {
public static void main(String[] args) {
testPool();
testPoolPerformance();
}
protected static Logger log = Logger.getLogger(PortScanner.class);
static IPool apool;
static IThreadPool tpool;
public PortScanner(){
CacheManager manager = CacheManager.getInstance(TestCacheConstants.STRATEGY_PATH);
apool = manager.getCachePool(CacheConstants.ASSIMENT_POOL);
tpool = (IThreadPool) manager.getCachePool(CacheConstants.THREAD_POOL);
try {// 休眠6s,等待池初始化结束
Thread.sleep(6000);
} catch (InterruptedException e) {
}
}
/**
* 测试池机制。</p><p>
* 包括ReusablePool的checkout,checkIn等操作 和 ThreadPool的机制(包括worker池和work队列)
*/
public static void testPool(){
Logger.getRootLogger().setLevel(Level.DEBUG);
PortScanner ps = new PortScanner();
ps.fillInWorkQueue(12, 28);
}
/**
* 测试池的性能。</p><p>
* 测试fillInWorkQueue()方法的执行时间,和每次checkOut的执行时间。</p><p>
*
* 分别以CGLIBProfiler来测试普通对象方法执行时间</p><p>
* 和利用ProxyProfiler来测试实现接口的对象方法执行时间。</p><p>
*
* 任务池的开关在缓存策略配置文件中设置,disabled(0:启用, 1:停用),比较两种状态下的性能。
*/
public static void testPoolPerformance(){
Logger.getRootLogger().setLevel(Level.INFO);
PortScanner ps = (PortScanner) new CGLIBProfiler().getProxy(PortScanner.class);
apool = (IPool) ProxyProfiler.frofiler(apool, new String[]{"checkOut"});
ps.fillInWorkQueue(1, 1000);
}
public void fillInWorkQueue(int beginport, int endport){
String host = "127.0.0.1";
for (int i = beginport; i <= endport; i++) {
Cacheable o = apool.checkOut(apool.getCacheStrategy().getInterruptTime().longValue());
_Scanner s = (_Scanner) o.getValue();
s.setHost(host);
s.setPort(i);
tpool.excute(apool, o);
}
log.debug("工作队列填充完毕!工填充了 " + (endport - beginport) + "个任务。");
while(true){
try {// 休眠130s,等待池中对象都过期后
Thread.sleep(130000);
} catch (InterruptedException e) {
}
log.debug("------------------130s等待结束---------------");
//测试checkIn事件是否重新唤醒apool池的cleaner线程
Cacheable o = apool.checkOut(100);
_Scanner s = (_Scanner) o.getValue();
s.setHost(host);
s.setPort(12);
tpool.excute(apool, o);
}
}
}