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 总结的更多相关文章
-
高可用的池化 Thrift Client 实现(源码分享)
本文将分享一个高可用的池化 Thrift Client 及其源码实现,欢迎阅读源码(Github)并使用,同时欢迎提出宝贵的意见和建议,本人将持续完善. 本文的主要目标读者是对 Thrift 有一定了 ...
-
Thrift笔记(四)--Thrift client源码分析
thrift文件 namespace java com.gxf.demo namespace py tutorial typedef i32 int // We can use typedef to ...
-
rpc框架之 thrift连接池实现
接前一篇rpc框架之HA/负载均衡构架设计 继续,写了一个简单的thrift 连接池: 先做点准备工作: package yjmyzz; public class ServerInfo { publi ...
-
由浅入深了解Thrift之客户端连接池化续
前文<由浅入深了解Thrift之客户端连接池化>中我们已经实现了服务调用端 连接的池化,实现的过于简陋,离实际的项目运用还很遥远.本文将在进一步改造,主要是两方面:1.服务端如何注册多个服 ...
-
Thrift全面介绍
官网:http://thrift.apache.org 简介 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java ...
-
[转载] 基于zookeeper、连接池、Failover/LoadBalance等改造Thrift 服务化
转载自http://blog.csdn.net/zhu_tianwei/article/details/44115667 http://blog.csdn.net/column/details/sli ...
-
Thrift 基于zookeeper改造模式
对于Thrift服务化的改造,主要是客户端,可以从如下几个方面进行: 1.服务端的服务注册,客户端自动发现,无需手工修改配置,这里我们使用zookeeper,但由于zookeeper本身提供的客户端使 ...
-
基于zookeeper、连接池、Failover/LoadBalance等改造Thrift 服务化
对于Thrift服务化的改造,主要是客户端,可以从如下几个方面进行: 1.服务端的服务注册,客户端自动发现,无需手工修改配置,这里我们使用zookeeper,但由于zookeeper本身提供的客户端使 ...
-
用apache commons-pool2建立thrift连接池
Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架.具体的介绍可以看Apache的官方网站:http://thrift.apache.org/ . ...
-
thrift:swift项目笔记
先声明:此swift不是Apple公司的那个swift开发语言,而是facebook的另一个开源项目. facebook的thrift IDL文件,如果默认用thrift -gen java生成jav ...
随机推荐
-
NuGet包引用依赖问题
如A包需要引用B包,然后在项目中安装A包时,自动把B包也装上. 在nuget命令行打包的时候,如果是指定项目的csproj文件进行打包的,都只能打包当前项目的dll,那么如果使用了第三方的dll而没有 ...
-
console.log 被重写覆盖以后如何恢复
有时候一些项目中会使用类似如下的方式覆盖掉console对象: var console = {}; console.log = function(){}; console.info = functio ...
-
tomcat web.xml配置
关于Tomcat 中 web.xml 文件的配置问题: 1.下面的配置是合法的 <servlet> <servlet-name>test</serv ...
-
[转]Google2012.9.24校园招聘会笔试题
代码: [cpp] view plaincopy //转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/8017703 boo ...
-
[Swift]LeetCode842. 将数组拆分成斐波那契序列 | Split Array into Fibonacci Sequence
Given a string S of digits, such as S = "123456579", we can split it into a Fibonacci-like ...
-
Android L2TP Client Setup
原文链接:http://www.softether.org/4-docs/2-howto/9.L2TPIPsec_Setup_Guide_for_SoftEther_VPN_Server/3.Andr ...
-
python 爬虫(一) requests+BeautifulSoup 爬取简单网页代码示例
以前搞偷偷摸摸的事,不对,是搞爬虫都是用urllib,不过真的是很麻烦,下面就使用requests + BeautifulSoup 爬爬简单的网页. 详细介绍都在代码中注释了,大家可以参阅. # -* ...
-
使用Navicat为MySQL建立定时任务
1.编写好每个小时需要指定的sql语句,我一般都是编写的一个update SQL,也可以编写好一个函数存储过程 2.点击事件,可能回看到一些事件列表,然后点击上方的“新建事件”,会打开一个事件定义框( ...
-
Ext JS 6学习文档-第7章-图表
Ext JS 6学习文档-第7章-图表 使用图表 本章中将探索在 ExtJS 中使用不同类型的图表并使用一个名为费用分析的示例项目结束本章所学.以下是将要所学的内容: 图表类型 条形图 和 柱形图 图 ...
-
nginx配置https服务器
方法一 1.创建证书 #cd /usr/local/nginx/conf #openssl genrsa -des3 -out server.key 1024 #openssl req -new -k ...