自己写的grpc简单连接池,基于common pool2

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值