开发者社区> 神巧合> 正文

Apache的commons-pool池创建多线程使用WebClient

简介: package test; import org.apache.commons.pool.PoolableObjectFactory; import org.apache.commons.pool.impl.GenericObjectPool; import org.apache.log4j.Logger; import com.gargoylesoftware.htmlunit.Brow
+关注继续查看
package test;

import org.apache.commons.pool.PoolableObjectFactory;
import org.apache.commons.pool.impl.GenericObjectPool;
import org.apache.log4j.Logger;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
//http://blog.csdn.net/m13321169565/article/details/8081410
public class PooledClientFactory{
    private static Logger log = Logger.getLogger(PooledClientFactory.class);
    private final static PooledClientFactory instance =new PooledClientFactory();
    //另外一种方案或许更为合适——对象池化技术。
    //基于Apache的commons-pool池
    private final GenericObjectPool clientPool =new GenericObjectPool();
    public static PooledClientFactory getInstance() {
        return instance;
    }
    
    public PooledClientFactory(){
        
        //实现对象池的对象创建工厂接口
        clientPool.setFactory(new PoolableObjectFactory() {
             // 创建对象实例,用于填充对象池。同时可以分配这个对象适用的资源。  
            @Override
            public Object makeObject() throws Exception  {
                log.info("为线程 [ " + Thread.currentThread().getName()+ 
                        " ] 创建新的WebClient实例!");
                
                 WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17);  
                    
                   //设置webClient的相关参数  
                  webClient.getCookieManager().setCookiesEnabled(true);// 开启cookie管理
                    webClient.getOptions().setJavaScriptEnabled(true);// 开启js解析
                    webClient.getOptions().setCssEnabled(false);
                    // 当出现Http error时,程序不抛异常继续执行
                    webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
                    // 防止js语法错误抛出异常
                    webClient.getOptions().setThrowExceptionOnScriptError(false); // js运行错误时,是否抛出异常
                    webClient.getOptions().setTimeout(10000);
                    // 默认是false, 设置为true的话不让你的浏览行为被记录
                    webClient.getOptions().setDoNotTrackEnabled(false);
                    // 设置Ajax异步处理控制器即启用Ajax支持
                    webClient
                            .setAjaxController(new NicelyResynchronizingAjaxController());
                    return webClient;
            }
            
             // 销毁对象,销毁对象池时被调用,连接池调用invalidateObject(obj)时被调用 
            @Override
            public void destroyObject(Object arg0) throws Exception {
                  log.info("销毁对象:" + arg0);  
                WebClient client = (WebClient) arg0;
                client.closeAllWindows();
                client = null;
            }
            
            //  查询对象有效性,需要对象池设置setTestOnBorrow(true),无效对象将被destroy
            @Override
            public boolean validateObject(Object arg0) {
                 log.info("检查对象有效性:" + arg0);  
                return true;
            }

              // 激活一个对象,从对象池获取对象时被调用  

            @Override
            public void activateObject(Object arg0) throws Exception {
                 log.info("激活对象:" + arg0);  
            }
            
             // 挂起(钝化)一个对象,将对象还给对象池时被调用
            @Override
            public void passivateObject(Object arg0) throws Exception {
                
                 log.info("挂起对象:" + arg0);  
            }

        });
        
        clientPool.setTestOnBorrow(true);
        //借出对象达到最大值的最大等待时间,5s等待时间过后抛出异常
        //clientPool.setMaxWait(5000);
        //设置最大可借出数量,默认为8
        clientPool.setMaxActive(10);
    }

    
    
    
    
    
    
    public WebClient getClient()  {
        try {
            return (WebClient)this.clientPool.borrowObject();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        
    }
    
    public void returnClient(WebClient client) {
        try {
            this.clientPool.returnObject(client);
        } catch (Exception e) {
            e.printStackTrace();
        }
        }

    
      //测试对象池
      public static void main(String[] args) {
          try {
              //CursorableLinkedList
            //得到池中空闲的对象数量,如果不可用返回负数
                log.info(PooledClientFactory.getInstance().clientPool.getNumIdle());
                
       //取出对象1
        Object obj1=    PooledClientFactory.getInstance().getClient();
        //取出对象2
        Object obj2=    PooledClientFactory.getInstance().getClient();
        //取出对象3
                Object obj3=    PooledClientFactory.getInstance().getClient();    
            //如果对象借出达到最大数量MaxActive,程序会一直等待有可用的对象(归还的),也可以通过DEFAULT_MAX_WAIT设置等待时间,默认为-1一直等待
                PooledClientFactory.getInstance().getClient();    
                PooledClientFactory.getInstance().getClient();    
                PooledClientFactory.getInstance().getClient();    
                PooledClientFactory.getInstance().getClient();    
                PooledClientFactory.getInstance().getClient();    
                PooledClientFactory.getInstance().getClient();    
            //归还对象1
                
            
        PooledClientFactory.getInstance().returnClient((WebClient) obj1);
        
        //得到池中空闲的对象数量
        log.info(PooledClientFactory.getInstance().clientPool.getNumIdle());
         //    返回从池中借出的对象数量
        log.info(PooledClientFactory.getInstance().clientPool.getNumActive());
        
        //最大可借出数量
        log.info(PooledClientFactory.getInstance().clientPool.getMaxActive());
        //最大空闲数量
        log.info(PooledClientFactory.getInstance().clientPool.getMaxIdle());
        //最小空闲数量
        log.info(PooledClientFactory.getInstance().clientPool.getMinIdle());
        
        
        PooledClientFactory.getInstance().clientPool.clear();
        PooledClientFactory.getInstance().clientPool.close();
        
        //使用工厂创建一个对象
        PooledClientFactory.getInstance().clientPool.getMaxActive();
        } catch (Exception e) {
            
            e.printStackTrace();
        }
        
    }
}


本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1792545

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
java多线程 -- 创建线程的第三者方式 实现Callable接口
Java 5.0 在 java.util.concurrent 提供了一个新的创建执行线程的方式:Callable 接口Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。
622 0
C#多线程编程系列(四)- 使用线程池
原文:C#多线程编程系列(四)- 使用线程池 目录 1.1 简介 1.2 在线程池中调用委托 1.3 向线程池中放入异步操作 1.4 线程池与并行度 1.5 实现一个取消选项 1.6 在线程池中使用等待事件处理器及超时 1.7 使用计时器 1.8 使用BackgroundWorker组件 参考书籍 笔者水平有限,如果错误欢迎各位批评指正! 1.1 简介 在本章中,主要介绍线程池(ThreadPool)的使用;在C#中它叫System.Threading.ThreadPool,在使用线程池之前首先我们得明白一个问题,那就是为什么要使用线程池。
878 0
java多线程 -- 线程池
第四种获取线程的方法:线程池,一个 ExecutorService,它使用可能的几个池线程之一执行每个提交的任务,通常使用 Executors 工厂方法配置。 线程池可以解决两个不同问题:由于减少了每个任务调用的开销,它们通常可以在执行大量异步任务时提供增强的性能,并且还可以提供绑定和管理资源(包括执行任务集时使用的线程)的方法。
678 0
Java 并发/多线程教程(七)-创建和启动java线程
      本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获。由于个人水平有限,不对之处还望矫正! 创建和启动线程 在java中创建一个线程如下: Thread thread = new Thread(); 调用方法start()来启动一个线程: thread.start();         这个例子没有指定线程执行任何代码,线程将会在启动之后停止。
979 0
+关注
346
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载