/* ================================================================== * 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); } } }