thrift - C#(CSharp)客户端连接池(ConnectionPool)


  调用示例:               
        var tran = ThriftPool.Instance().BorrowInstance();
            TProtocol protocol = new TBinaryProtocol(tran);
            var client = new xxxx(protocol);   //xxxx为生成的thrift代理类的Client对象
            var ret = client.TestMethod(parameters);     //TestMethod为业务方法名称
            ThriftPool.Instance().ReturnInstance(tran);
            return ret;
  配置信息类:
    internal class ThriftConfig
    {
        #region 单例入口
 
        private static ThriftConfig instance = null;
        private static object objLock = new object();
        public static ThriftConfig Instance()
        {
            if (instance == null)
            {
                lock (objLock)
                {
                    if (instance == null)
                    {
                        instance = new ThriftConfig();
                    }
                }
            }
            return instance;
        }
 
        #endregion
 
        #region 私有构造函数
 
        private ThriftConfig()
        {
            Host = ConfigHelper.GetAppSettingValue("ESHost");
            Port = ConfigHelper.GetAppSettingInt32Value("ESPort");
            Encode = Encoding.UTF8;
            Timeout = 3000;
            MaxActive = ConfigHelper.GetAppSettingInt32Value("ESMaxActiveConnectionCount");
            MaxIdle = ConfigHelper.GetAppSettingInt32Value("ESMaxIdleConnectionCount");
            MinIdle = ConfigHelper.GetAppSettingInt32Value("ESMinIdleConnectionCount");
            MaxWait = 5;
        }
 
        #endregion
 
        #region 配置属性定义
 
        public string Host { get; set; }
 
        public int Port { get; set; }
 
        public Encoding Encode { get; set; }
 
        public bool Zipped { get; set; }
 
        public int Timeout { get; set; }
 
        public int MaxActive { get; set; }
 
        public int MaxIdle { get; set; }
 
        public int MinIdle { get; set; }
 
        public int MaxWait { get; set; }
        #endregion
 
    }
    连接池处理类:
    internal class ThriftPool
    {
        #region 属性
 
        private ThriftConfig config;
 
        /// 对象缓存池
        private static Stack objectPool { get; set; }
        /// 同步对象
        private static AutoResetEvent resetEvent;
 
        /// 空闲对象数
        private static volatile int idleCount = 0;
 
        private static volatile int activeCount = 0;
 
        /// 同步对象锁
        private static object locker = new object();
 
        #endregion
 
        #region 单例入口
 
        private static long testcount = 0;
        private static ThriftPool instance = null;
        private static object objLock = new object();
        public static ThriftPool Instance()
        {
            if (instance == null)
            {
                lock (objLock)
                {
                    if (instance == null)
                    {
                        instance = new ThriftPool();
                    }
                }
            }
            return instance;
        }
 
        #endregion
 
        #region 构造函数
 
        private ThriftPool()
        {
            config = ThriftConfig.Instance();
            CreateResetEvent();
            CreateThriftPool();
        }
 
        #endregion
 
        #region 公有操作方法
 
        /// 从对象池取出一个对象
        public TTransport BorrowInstance()
        {
            lock (locker)
            {
                //Zkx.Infrastruction.Logger.Log.DebugFormat("借前对象池个数:{0},空闲个数:{1}", objectPool.Count(), idleCount);
                TTransport transport;
                //对象池无空闲对象
 
                if (idleCount == 0)
                {
                    //对象池已已创建对象数达上限
                    if (activeCount >= config.MaxActive)
                    {
                        //Console.WriteLine("waiting..." + activeCount);
                        resetEvent.WaitOne();
                    }
                    else
                    {
                        PushObject(CreateInstance());
                    }
                }
                transport = objectPool.Pop();
                //Console.WriteLine("Pop 对象..." + transport.IsOpen);
 
                //空闲对象数小于最小空闲数,添加一个对象到对象池(已创建数不能超标)
                if (--idleCount < config.MinIdle && activeCount < config.MaxActive)
                {
                    PushObject(CreateInstance());
                }
 
                ValidateInstance(transport);
                //Console.WriteLine("借出......对象池个数:{0},空闲个数:{1}," + testcount, objectPool.Count(), idleCount);
                return transport;
            }
        }
 
        /// 归还一个对象
        /// 
        public void ReturnInstance(TTransport instance)
        {
            lock (locker)
            {
               // Console.WriteLine("Push 对象..." + instance.IsOpen);
 
                //空闲对象数达到上限,不再返回线程池,直接销毁
                if (idleCount == config.MaxIdle)
                {
                    DestoryInstance(instance);
                }
                else
                {
                    ValidateInstance(instance);
                    PushObject(instance);
                    //发通知信号,有对象归还到对象池
                    resetEvent.Set();
                    //Console.WriteLine("归还...");
                }
            }
        }
        #endregion
 
        #region 私有方法
 
        /// 创建线程同步对象
        private void CreateResetEvent()
        {
            lock (locker)
            {
                if (resetEvent == null)
                {
                    resetEvent = new AutoResetEvent(false);
                }
            }
        }
 
        /// 创建对象池
        private void CreateThriftPool()
        {
            lock (locker)
            {
                if (objectPool == null)
                {
                    objectPool = new Stack();
                }
            }
        }
 
        /// 添加对象到对象池
        private void PushObject(TTransport transport)
        {
            objectPool.Push(transport);
            idleCount++;
        }
 
        /// 创建一个对象
        private TTransport CreateInstance()
        {
            activeCount++;
            var objsocket = new TSocket(config.Host, config.Port);
            objsocket.Timeout = 5000;
            TTransport transport = objsocket;
 
            transport.Open();
            //Console.WriteLine("创建对象..." + activeCount);
            return transport;
        }
 
        /// 校验对象
        private void ValidateInstance(TTransport instance)
        {
            if (!instance.IsOpen)
            {
                //Console.WriteLine("校验_重新打开...");
                instance.Open();
            }
        }
 
        /// 销毁对象
        private void DestoryInstance(TTransport instance)
        {
            if (instance.IsOpen)
            {
                instance.Close();
            }
            //instance.Flush();
            instance.Dispose();
            activeCount--;
            //Console.WriteLine("销毁...");
        }
 
        #endregion
    }