设为首页 收藏本站
查看: 1074|回复: 0

[经验分享] Apache的commons-pool池创建多线程使用WebClient

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-6-27 09:16:28 | 显示全部楼层 |阅读模式
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();
        }
         
    }
}



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-235755-1-1.html 上篇帖子: Pacemaker+ISCSI 实现Apache高可用实战 下篇帖子: Apache Shiro 认证、授权、加密和会话管理 多线程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表