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

[经验分享] org.apache.commons.pool2 初体验 之GenericKeyedObjectPool

[复制链接]

尚未签到

发表于 2017-1-10 09:45:47 | 显示全部楼层 |阅读模式
package com.binovel.util;

import org.apache.commons.pool2.KeyedPooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.commons.pool2.impl.GenericKeyedObjectPool;

public class MyTestPool {
private GenericKeyedObjectPool<String, FileUtilTest> myObjectPool;
public void init(){
if(this.myObjectPool == null){
this.myObjectPool = new GenericKeyedObjectPool<String, FileUtilTest>(
new KeyedPooledObjectFactory<String, FileUtilTest>() {
public PooledObject<FileUtilTest> makeObject(String key)
throws Exception {
//这里是生成对象
FileUtilTest file = new FileUtilTest();
DefaultPooledObject<FileUtilTest> pooledObject = new DefaultPooledObject<FileUtilTest>(file);
return pooledObject;
}
public void destroyObject(String key,
PooledObject<FileUtilTest> p) throws Exception {
System.out.println("an object closed");
}
public boolean validateObject(String key,
PooledObject<FileUtilTest> p) {
// TODO Auto-generated method stub
//这里是返回是否对象池的对象是正确的,如果返回false的话 就会一直取对象,直到报错
//这里需要对象中有一个判断方法来判断是否active
//我就是瞎搞搞 直到这个方法是干嘛就行了
return true;
}
//看borrowobject源代码,在成功从queue中获取到对象时,会调用这个方法来激活这个对象
//然后再调用上面那个validateObject来确定对象是不是好用,所以说这个方法也很重要
//if (null != factory && null != obj) { 
             //  try {
      //factory.activateObject(ref); 
                //    if (!factory.validateObject(ref)) { 
                     //   throw new Exception("ValidateObject failed"); 
     // } 
public void activateObject(String key,
PooledObject<FileUtilTest> p) throws Exception {
// TODO Auto-generated method stub
}
public void passivateObject(String key,
PooledObject<FileUtilTest> p) throws Exception {
// TODO Auto-generated method stub
}
}
);
// Set max idle (not max active) since our connections always idle in the pool.
this.myObjectPool.setMaxIdlePerKey(1);
// We always want our validate method to control when idle objects are evicted.
this.myObjectPool.setTestOnBorrow(true);
this.myObjectPool.setTestWhileIdle(true);
}
}
public GenericKeyedObjectPool<String, FileUtilTest> getPooded(){
return this.myObjectPool;
}
public synchronized FileUtilTest getFileUtilTest(String key){
FileUtilTest test = null;
//这里我写死设置线程池中为5
if(this.getPooded().getNumIdle(key)<5){
try {
// we want borrowObject to return the one we added.
myObjectPool.setLifo(true);
myObjectPool.addObject(key);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
myObjectPool.setLifo(false);
}
while(test==null){
try {
//这里循环取出对象 有对象的话就break
//其实写的不好 可以看下人家的pool中的实现
/* while (connection == null) {
connection = connectionsPool.borrowObject(key);
synchronized (connection) {
if (connection.getConnection() != null) {
connection.incrementReferenceCount();
break;
}
// Return the bad one to the pool and let if get destroyed as normal.
connectionsPool.returnObject(key, connection);
connection = null;
}
}*/
test = myObjectPool.borrowObject(key);
synchronized (test) {
if (test != null) {
break;
}
//这里如果失败了就把对象放回去
myObjectPool.returnObject(key, test);
}
} catch (Exception e) {
System.out.println("this is message");
e.printStackTrace();
}
}
return test;
}
public static void main(String[] args) {
MyTestPool mypool = new MyTestPool();
mypool.init();
FileUtilTest file = mypool.getFileUtilTest("first");
FileUtilTest file2 = mypool.getFileUtilTest("second");
System.out.println(file);
System.out.println(file2);
}
}

  这段时间看JMS 规范。 顺便看了下Activemq 的实现,其中activemq 自己实现了connectionpool 来存储大对象Connection  其中实现利用了apache.commons.pool中的GenericKeyedObjectPool 线程池 就顺便自己模仿这学习了下 ,代码里面写的很清楚了。。最后返回2个不同的对象
  附带一个blog 这里面是objectPool的源码分析 挺好的
  http://shmilyaw-hotmail-com.iteye.com/blog/1986566
  还有就是这个 写的是pool2的 整体结构,感觉比原来多的是一个PooledObject包装类,所以我们在makeObject中返回的是一个包装类而不是直接一个object,这是自己的理解,还要看看pool1中的实现,
  据说pool2 全部重新架构了对象池。。。哎 不知道有时间没 看看吧
  http://shmilyaw-hotmail-com.iteye.com/blog/1983845

运维网声明 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-326387-1-1.html 上篇帖子: SVN与Apache HTTP服务器的整合安装 下篇帖子: sun公司和apache使用ftpclient的区别
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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