打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
通用池:commons pool 2

首先感谢下文作者,虽然没看你的内容,但是参考了参数。

Apache commons-pool对象池原理分析

最近遇到一个场景:

我作为一个中间件,连接一个没有提供接口的网站,htmlunit模拟html交互,然后把数据返回;对客户来说,我提供了一组标准接口。

因为该网站需要登录,网站登录过程很慢,所以面临两个问题:

第一是WebClient需要重用;

第二是不同的用户的htmlunit的WebClient实例是不能混用的,但是对于单用户来说,可能需要一个WebClient池。

本来想自己寨一个,后来想想细节太多不合适。先看了google guava cache,觉得api太复杂了,完全没看懂;然后又想到10年前看过apache commons pool源代码,查了一下现在是pool2了,完全重写,仔细看了看api,正好是我所需要的。

 

pool2实际使用很简单,但是官网的例子不太给力。其实只有三个要点(为什么是三点...):

1.Factory

回调。用于对象创建,销毁,验证,防止发呆等。

 

2.Pool的配置

池的参数。比如最大多少个,最小多少个,最长发呆时间(发呆过长就remove了),等等。

 

3.Pool实例

实际干活的。

 

针对我这个例子,首先定义一个factory

 

Java代码  
  1. import com.gargoylesoftware.htmlunit.BrowserVersion  
  2. import com.gargoylesoftware.htmlunit.WebClient  
  3. import com.hitoz.auexpress.express.WebClientKey  
  4. import org.apache.commons.pool2.BaseKeyedPooledObjectFactory  
  5. import org.apache.commons.pool2.PooledObject  
  6. import org.apache.commons.pool2.impl.DefaultPooledObject  
  7.   
  8. /** 
  9.  * Created by Ken on 2014/5/27. 
  10.  */  
  11. class WebClientFactory extends BaseKeyedPooledObjectFactory<WebClientKey, WebClient> {  
  12.   
  13.     @Override  
  14.     void destroyObject(WebClientKey key, PooledObject<WebClient> p) throws Exception {  
  15.         key.worker?.doCleanup(p.object)  
  16.     }  
  17.   
  18.     @Override  
  19.     public WebClient create(WebClientKey key) throws Exception {  
  20.         WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_8)  
  21.         webClient.options.activeXNative = false  
  22.         webClient.options.redirectEnabled = true  
  23.         webClient.options.useInsecureSSL = true  
  24.         webClient.options.javaScriptEnabled = false  
  25.         webClient.options.cssEnabled = false  
  26.         webClient.options.timeout = 10 * 1000L//10s  
  27.         webClient.options.throwExceptionOnFailingStatusCode = false  
  28.   
  29.         key.worker?.doInit(key, webClient)  
  30.         return webClient  
  31.     }  
  32.   
  33.     @Override  
  34.     public PooledObject<WebClient> wrap(WebClient value) {  
  35.         return new DefaultPooledObject<WebClient>(value)  
  36.     }  
  37.   
  38.     @Override  
  39.     void passivateObject(WebClientKey key, PooledObject<WebClient> p) throws Exception {  
  40.         p.object?.closeAllWindows()  
  41.     }  
  42. }  

 然后是参数:

 

 

 

Java代码  
  1. GenericKeyedObjectPoolConfig config = new GenericKeyedObjectPoolConfig()  
  2.         config.setMaxTotal(500//整个池最大值  
  3.         config.setMaxTotalPerKey(5//每个key的最大  
  4.         config.setBlockWhenExhausted(true)  
  5.         config.setMinIdlePerKey(0)  
  6.         config.setMaxWaitMillis(-1//获取不到永远等待  
  7.         config.setNumTestsPerEvictionRun(Integer.MAX_VALUE) // always test all idle objects  
  8.         config.setTestOnBorrow(true)  
  9.         config.setTestOnReturn(false)  
  10.         config.setTestWhileIdle(false)  
  11.         config.setTimeBetweenEvictionRunsMillis(1 * 60000L) //-1不启动。默认1min一次  
  12.         config.setMinEvictableIdleTimeMillis(10 * 60000L) //可发呆的时间,10mins  
  13.         config.setTestWhileIdle(false)  //发呆过长移除的时候是否test一下先  

 

 

最后是干活的pool

 

Java代码  
  1. WebClientFactory webClientFactory = new WebClientFactory()  
  2. GenericKeyedObjectPool<WebClientKey, WebClient> pool = new GenericKeyedObjectPool<WebClientKey, WebClient>(webClientFactory)  

 

 

ok,从现在开始,只需要操作pool就可以了。

获取对象是

def webClient = pool.borrowObject(key)

使用完毕记得在finally里面

pool.returnObject(key, webClient)

 

通篇都是groovy代码,加上分号就是java。

 

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
关于spring中 几个 java.lang.ClassNotFoundException...
Apache Commons
[HtmlUnit]Fetch Dynamic Html/Content Created By Javascript/Ajax
Apache Common Configuration 初步使用
【译】在Tomat7上使用Redis保存Session
使用Jakarta Commons Pool处理对象池化
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服