DefaultEvictionPolicy类是EvictionPolicy接口的实现主要描述,pool中那些idel对象会被Evict,回收。
关键代码如下:
public boolean evict(EvictionConfig config, PooledObject<T> underTest,
int idleCount) { if ((config.getIdleSoftEvictTime() < underTest.getIdleTimeMillis() &&
config.getMinIdle() < idleCount) ||
config.getIdleEvictTime() < underTest.getIdleTimeMillis()) {
return true;
}
return false;
}

ObjectPool 接口:

Object obj = null
try{
  obj = pool.borrowObject();
  try{
    //...use the object...
    }catch(Exception e) {
      pool.invalidateObject(obj);// invalidate the object
      // do not return the object to the pool twice
      obj = null
    }finally{
      // make sure the object is returned to the pool
      if(null!= obj) pool.returnObject(obj);
    } 
}catch(Exception e) { // failed to borrow an object }
PooledObjectState 定义池对象的所有可能状态:
public enum PooledObjectState {
/**
* In the queue, not in use.
*/
IDLE, /**
* In use.
*/
ALLOCATED, /**
* In the queue, currently being tested for possible eviction.
*/
EVICTION, /**
* Not in the queue, currently being tested for possible eviction. An
* attempt to borrow the object was made while being tested which removed it
* from the queue. It should be returned to the head of the queue once
* eviction testing completes.
* TODO: Consider allocating object and ignoring the result of the eviction
* test.
*/
EVICTION_RETURN_TO_HEAD, /**
* In the queue, currently being validated.
*/
VALIDATION, /**
* Not in queue, currently being validated. The object was borrowed while
* being validated and since testOnBorrow was configured, it was removed
* from the queue and pre-allocated. It should be allocated once validation
* completes.
*/
VALIDATION_PREALLOCATED, /**
* Not in queue, currently being validated. An attempt to borrow the object
* was made while previously being tested for eviction which removed it from
* the queue. It should be returned to the head of the queue once validation
* completes.
*/
VALIDATION_RETURN_TO_HEAD, /**
* Failed maintenance (e.g. eviction test or validation) and will be / has
* been destroyed
*/
INVALID, /**
* Deemed abandoned, to be invalidated.
*/
ABANDONED, /**
* Returning to the pool.
*/
RETURNING
}

ThriftClientPool 类剖析:

  • 设置配置

    • TestOnReturn= true
    • TestOnBorrow=true
  • GenericObjectPool对象池构建:关键代码如下:
  • new GenericObjectPool<>(new BasePooledObjectFactory<ThriftClient<T>>() {
    
                @Override
    public ThriftClient<T> create() throws Exception { // get from global list first
    List<ServiceInfo> serviceList = ThriftClientPool.this.services;
    ServiceInfo serviceInfo = getRandomService(serviceList);
    TTransport transport = getTransport(serviceInfo); try {
    transport.open();
    } catch (TTransportException e) {
    logger.info("transport open fail service: host={}, port={}",
    serviceInfo.getHost(), serviceInfo.getPort());
    if (poolConfig.isFailover()) {
    while (true) {
    try {
    // mark current fail and try next, until none service available
    serviceList = removeFailService(serviceList, serviceInfo);
    serviceInfo = getRandomService(serviceList);
    transport = getTransport(serviceInfo); // while break here
    logger.info("failover to next service host={}, port={}",
    serviceInfo.getHost(), serviceInfo.getPort());
    transport.open();
    break;
    } catch (TTransportException e2) {
    logger.warn("failover fail, services left: {}", serviceList.size());
    }
    }
    } else {
    throw new ConnectionFailException("host=" + serviceInfo.getHost() + ", ip="
    + serviceInfo.getPort(), e);
    }
    } ThriftClient<T> client = new ThriftClient<>(clientFactory.createClient(transport),
    pool, serviceInfo); logger.debug("create new object for pool {}", client);
    return client;
    } @Override
    public PooledObject<ThriftClient<T>> wrap(ThriftClient<T> obj) {
    return new DefaultPooledObject<>(obj);
    } @Override
    public boolean validateObject(PooledObject<ThriftClient<T>> p) {
    ThriftClient<T> client = p.getObject(); // check if return client in current service list if
    if (serviceReset) {
    if (!ThriftClientPool.this.services.contains(client.getServiceInfo())) {
    logger.warn("not return object cuase it's from previous config {}", client);
    client.closeClient();
    return false;
    }
    } return super.validateObject(p);
    } @Override
    public void destroyObject(PooledObject<ThriftClient<T>> p) throws Exception {
    p.getObject().closeClient();
    super.destroyObject(p);
    }
    }

     X iface 返回TServiceClient的代理对象关键代码如下:可以看到首先从池中借对象,然后生成TServiceClient的代理对象,代理handler主要实际执行thrift方法,成功时归还到池,失败时需要关闭TServiceClient,并在池中invalidateObject(ThriftClient)

UML类关系图:

wealoha thrift-client-pool 总结的更多相关文章

  1. 高可用的池化 Thrift Client 实现(源码分享)

    本文将分享一个高可用的池化 Thrift Client 及其源码实现,欢迎阅读源码(Github)并使用,同时欢迎提出宝贵的意见和建议,本人将持续完善. 本文的主要目标读者是对 Thrift 有一定了 ...

  2. Thrift笔记(四)--Thrift client源码分析

    thrift文件 namespace java com.gxf.demo namespace py tutorial typedef i32 int // We can use typedef to ...

  3. rpc框架之 thrift连接池实现

    接前一篇rpc框架之HA/负载均衡构架设计 继续,写了一个简单的thrift 连接池: 先做点准备工作: package yjmyzz; public class ServerInfo { publi ...

  4. 由浅入深了解Thrift之客户端连接池化续

    前文<由浅入深了解Thrift之客户端连接池化>中我们已经实现了服务调用端 连接的池化,实现的过于简陋,离实际的项目运用还很遥远.本文将在进一步改造,主要是两方面:1.服务端如何注册多个服 ...

  5. Thrift全面介绍

    官网:http://thrift.apache.org   简介 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java ...

  6. [转载] 基于zookeeper、连接池、Failover/LoadBalance等改造Thrift 服务化

    转载自http://blog.csdn.net/zhu_tianwei/article/details/44115667 http://blog.csdn.net/column/details/sli ...

  7. Thrift 基于zookeeper改造模式

    对于Thrift服务化的改造,主要是客户端,可以从如下几个方面进行: 1.服务端的服务注册,客户端自动发现,无需手工修改配置,这里我们使用zookeeper,但由于zookeeper本身提供的客户端使 ...

  8. 基于zookeeper、连接池、Failover/LoadBalance等改造Thrift 服务化

    对于Thrift服务化的改造,主要是客户端,可以从如下几个方面进行: 1.服务端的服务注册,客户端自动发现,无需手工修改配置,这里我们使用zookeeper,但由于zookeeper本身提供的客户端使 ...

  9. 用apache commons-pool2建立thrift连接池

    Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架.具体的介绍可以看Apache的官方网站:http://thrift.apache.org/ . ...

  10. thrift:swift项目笔记

    先声明:此swift不是Apple公司的那个swift开发语言,而是facebook的另一个开源项目. facebook的thrift IDL文件,如果默认用thrift -gen java生成jav ...

随机推荐

  1. IEnumerable,ICollection,IList,List之间的区别

    做C#的同学们,都知道,一类只能有一个继承类,但可以实现多个接口.这句话就告诉我们:IEnumerable,ICollection,IList,List区别了 // 摘要: // 公开枚举器,该枚举器 ...

  2. iOS代码处理横屏问题

    借助通知来控制界面的横竖屏切换.还是整个App中大部分界面都是竖屏,某个界面可以横竖屏切换的情况. 首先,在[General]-->[Device Orientation]设置仅支持竖屏,lik ...

  3. win10 uwp App-to-app communication 应用通信

    这篇文章都是乱说的,如果觉得有不好的,可以发我邮箱 应用之间需要相互的发送信息,就是我们经常用的分享 有个人看到一个网页很好,于是就希望把这个网页发送到邮件,那么这样的话就是使用应用通信. 因为每个应 ...

  4. python第二课

    本节内容 1.列表list.切片 2.字典dict

  5. LINUX 笔记-vmstat命令

    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff ...

  6. ubuntu16.04 配置opensips服务器并编译pjsip测试

    一.版本相关 1) ubuntu版本: 16.04 2) opensips版本:2.1.2 3) pjsip版本 :2.5.5 4) ffmpeg版本:3.3.4 5) sdl版本:2.0 6) vs ...

  7. json_encode()中文不转码

    php使用json_encode()把数组转换为json的时候,总会把中文进行转码,转码后从json数据上我们无法看出其中的中文文字.php5.4以后,当json_encode()的第二个参数赋值为J ...

  8. JAVA 的 Date、Calendar的常用用法

    一.Date与String的互转用法,这里需要用到SimpleDateFormat Date date = new Date();        //设置格式        SimpleDateFor ...

  9. Idea报错Check $M2_HOME environment variable and mvn script match.

    -Dmaven.multiModuleProjectDirectory=$M2_HOME

  10. 从架构演进的角度聊聊Spring Cloud都做了些什么?

    Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:Spring Cl ...