17年的时候写的证券的项目,当时交易端是另外一批同事开发的,他们强烈要求用grpc,当时这个东西还不那么成熟,在网上也搜索不到比较完美的第三方的连接池搭配使用,索性就自己写了一个,因为之前thrift也自己写过类似的连接池,所以也不算太麻烦,之前thrift的连接池是纯手工写的,没有用第三方的连接池库,使用的时候排过几次雷,这次不想那么麻烦,所以直接就是用commons-pool2的连接池库。好了,废话不多说,直接贴代码。
第一个类GrpcSocketPool是基础的连接池类,主要是初始化连接池,配置一些常见的连接池参数,提供获取和归还连接的方法。
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import io.grpc.ManagedChannel;
public class GrpcSocketPool {
private GenericObjectPool<SocketPoolBean<ManagedChannel>> objectPool = null;
private String ip;
private Integer port;
private Integer maxTotal;
private Integer minIdle;
private Integer maxIdle;
private Integer minEvictableIdleTimeMillis;
private String channelName;
public void init() {
// 连接池的配置
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
// 池中的最大连接数
poolConfig.setMaxTotal(maxTotal);
// 最少的空闲连接数
poolConfig.setMinIdle(minIdle);
// 最多的空闲连接数
poolConfig.setMaxIdle(maxIdle);
// 当连接池资源耗尽时,调用者最大阻塞的时间,超时时抛出异常 单位:毫秒数
poolConfig.setMaxWaitMillis(10000);
// 连接池存放池化对象方式,true放在空闲队列最前面,false放在空闲队列最后
poolConfig.setLifo(true);
// 连接空闲的最小时间,达到此值后空闲连接可能会被移除,默认即为30分钟
poolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
// 连接耗尽时是否阻塞,默认为true
poolConfig.setBlockWhenExhausted(true);
poolConfig.setTestOnReturn(true);
// 连接池创建
objectPool = new GenericObjectPool<SocketPoolBean<ManagedChannel>>(new GrpcSocketFactory(ip, port), poolConfig);
}
/**
* 从连接池获取对象
* @throws TradeServerException
*/
public SocketPoolBean<ManagedChannel> borrowObject() throws TradeServerException {
try {
SocketPoolBean<ManagedChannel> bean = objectPool.borrowObject();
return bean;
} catch (Exception e) {
throw new TradeServerException(ExceptionEnu.CHANNEL_ERROR);
}
}
public void returnObject(SocketPoolBean<ManagedChannel> bean){
objectPool.returnObject(bean);
}
public void destory(){
ip = null;
port = null;
maxTotal = null;
minIdle = null;
maxIdle = null;
minEvictableIdleTimeMillis = null;
channelName = null;
objectPool.close();
}
public String getChannelName() {
return channelName;
}
public void setChannelName(String channelName) {
this.channelName = channelName;
}
@Override
public String toString() {
return new StringBuilder("ip:").append(ip).append(",port:").append(port).toString();
}
pu