# socket-pool **Repository Path**: bertli/socket-pool ## Basic Information - **Project Name**: socket-pool - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2016-04-15 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 简介 自定义socket连接池实现 socket包,拷贝自`https://github.com/dingshuangxi888/JavaSocketConnectionPool.git` socket2包,基于common-pool2实现socketconnection netty包,基于netty的socket chanel和common-pool2的实现 apache.hadoop,hadoop源码中net包的拷贝 ## hadoop.net包 基于nio进行数据io操作,金光闪闪吊炸天 SocketIOWithTimeout,支持带超时的读写操作(doIO方法实现,具体是读还是写交给抽象方法(子类)performIO实现) 带超时的读写操作,原理就是 doIO(buffer){ buffer// 要读写的buffer while(buffer.hasremaing()){ // channel尝试读写一次 performIO(buffer) // 如果设定的时间内不能readable/wriable,就报SocketTimeoutException count = selectorPool.select(channel, ops, timeout) } } 由此可以看到nio之后,使用bytebuffer的一个优势,那就是操作的统一。read(buffer),write(buffer) //构成一个selector池,有channel调用select(SelectableChannel channel, int ops, long timeout)方法就为其分配一个空闲的selecotr,用完回收,如果一个selector空闲时间太长,就关闭它 SelectorPool{ // channel在timeout时间内是否可以进行ops,其底层实现还是selector.select(timeout),牛 int select(SelectableChannel channel, int ops, long timeout) // 每次为一个channel准备一个空闲的selector。一个selector在某个时刻只负责一个channel(如果负责多个的话,timeout就不准了)。 SelectorInfo get(SelectableChannel channel) } SelectorPool提供的select方法,意义还是蛮大的 1. 从以前的一个selector负责多个socketchannel变成一对一 2. 我们知道,nio设置成非阻塞后,没有超时一说(只是buffer中有没有数据的区别),而它提供了一种判断超时的机制。 3. 隐藏了selector的创建和销毁。这样,**nio的数据读写就不用eventloop**,回归到以socketchannel为主角,编写代码的感觉跟bio就比较像了。 SelectorProvider 在nio中的重要地位,selecotr,socketchannel,serversocketchannel都是由它生成的。它的基本原理可以参见 http://shift-alt-ctrl.iteye.com/blog/1841511 ## common-pool2如何控制实例的个数 GenericObjectPool{ PooledObjectFactory factory; Map> allObjects LinkedBlockingDeque> idleObjects } - allObjects All of the objects currently associated with this pool in any state. It excludes objects that have been destroyed. The size of allObjects will always be less than or equal to maxActive. Map keys are pooled objects, values are the PooledObject wrappers used internally by the pool. borrowObject 1. 从idleObjects取出或创建pooledObject(如果是新创的加入到allObects) 2. active PooledObject 3. validate PooledObject 4. 如果失败(没有得到一个可用的对象),则返回步骤1 returnObject 1. 如果设置了return Object时validate PooledObject,就校验下,校验失败的丢弃 2. passivateObject 3. 加入到idleObjects(如果 idleObjects.size() >= maxIdleSave则destroy object) 4. 更新相关状态 其它对象 - AbandonedConfig,决定何时抛弃Abandoned object,比如removeAbandonedOnBorrow或removeAbandonedOnMaintenance - DefaultEvictionPolicy,提供`boolean evict(EvictionConfig,PooledObject)`判断是否满足evict(驱逐)一个object的条件。GenericObjectPool构造函数会启动startEvictor(a timer),从idleObjects移除不必要的对象