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. jdbc学习笔记

    知识概要: 1.JDBC简介 2.JDBC的编码步骤 3.JDBC中常用接口或类详解 4.JDBC中释放资源 5.JDBC进行CRUD 1.JDBC简介 JDBC:Java DataBase Conn ...

  2. vue 实现 换一换 功能

    点击按钮列表页随机获取三个商品并渲染 后台返回的数据为 d为一个数组 数组 arr=[0,1,2]初始值 data:{ list:d, arr:[0,1,2] } 生产随机数 replace:func ...

  3. Dapper数据库相关操作

    using System; using System.Data; using System.Configuration; using System.Data.SqlClient; namespace ...

  4. DevOps之存储和数据库

    唠叨话 关于德语噢屁事的知识点,仅提供专业性的精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. <数据(Data)> 了解有关数据部分.涉及存储及数据库的概念:知识与技能的层次( ...

  5. php 守护进程类

    最近个人项目中需要后台运行任务,之前一直是用nouhp & + 重定向输出 来后台跑任务,后来觉得不好维护原始数据,同时可能也没有直接操作进程那么稳吧(没验证).废话少说,来看分析. 首先,我 ...

  6. 关于 SVN 项目检出

    前几天呢,同事遇到这么一个问题:他新建了一个工作空间,当他通过 svn 检出公司项目的时候,准备过来测试运行,但是呢出现了下面的报错 [ERROR] Failed to execute goal or ...

  7. phalcon——Paginator分页

    phalcon使用的分页器是Phalcon\Paginator. 首先先展示一个比较完整的使用例子: 控制器代码: use Phalcon\Paginator\Adapter\Model as Pag ...

  8. Go语言之三驾马车

    作者:唐郑望,腾讯后台开发 工程师商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处.  WeTest 导读 Go语言的三个核心设计: interface | goroutine | cha ...

  9. Java语言实现机制

    Java语言实现机制 1.Java虚拟机(Java Virtual Machine) Java虚拟机(JVM)是在一台计算机上由软件模拟也可以用硬件来实现的假想的计算机.它定义了指令集(相当于中央处理 ...

  10. Power Strings(KMP)

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 45008   Accepted: 18794 D ...