// Path: ourea-core/src/main/java/com/taocoder/ourea/core/consumer/ConsumerPoolFactory.java
// public class ConsumerPoolFactory implements PooledObjectFactory<TTransport> {
// 
//     private static final Logger LOGGER = LoggerFactory.getLogger(ConsumerPoolFactory.class);
// 
//     /**
//      * 服务提供者的信息
//      */
//     private ProviderInfo providerInfo;
// 
//     /**
//      * 调用服务的超时时间
//      */
//     private int timeout;
// 
//     public ConsumerPoolFactory(ProviderInfo providerInfo, int timeout) {
//         this.providerInfo = providerInfo;
//         this.timeout = timeout;
//     }
// 
//     /**
//      * 这个地方创建连接的时候,如果创建失败,重试一次,还不行则抛出异常,把该节点暂时移除
//      * 
//      * @return
//      * @throws Exception
//      */
//     @Override
//     public PooledObject<TTransport> makeObject() throws Exception {
//         TTransport transport = null;
//         Exception ex = null;
//         int retryConn = 1;
//         do {
//             try {
//                 transport = new TSocket(providerInfo.getIp(), providerInfo.getPort(), timeout);
//                 transport.open();
//                 ((TSocket) transport).setTimeout(timeout);
//                 return new DefaultPooledObject<TTransport>(transport);
//             } catch (Exception e) {
//                 ex = e;
//             }
//         } while (retryConn-- > 0);
//         LOGGER.error("make transport object fail.e:", ex);
//         throw new OureaConnCreateException("make transport object fail." + ex.getMessage());
//     }
// 
//     @Override
//     public void destroyObject(PooledObject<TTransport> p) throws Exception {
// 
//         try {
//             TTransport transport = p.getObject();
//             if (transport.isOpen()) {
//                 transport.close();
//             }
//         } catch (Exception e) {
//             LOGGER.error("destroy transport object fail.maybe exist memory leek.e:", e);
//             throw new OureaException("destroy transport object fail" + e.getMessage());
//         }
// 
//     }
// 
//     @Override
//     public boolean validateObject(PooledObject<TTransport> p) {
//         if (p.getObject().isOpen()) {
//             return true;
//         }
//         return false;
//     }
// 
//     @Override
//     public void activateObject(PooledObject<TTransport> p) throws Exception {
// 
//     }
// 
//     @Override
//     public void passivateObject(PooledObject<TTransport> p) throws Exception {
// 
//     }
// }
// 
// Path: ourea-core/src/main/java/com/taocoder/ourea/core/config/OureaObjectPoolConfig.java
// public class OureaObjectPoolConfig extends GenericObjectPoolConfig {
// 
//     /**
//      * 最大连接数
//      */
//     private int maxTotal = 100;
// 
//     /**
//      * 最大空闲连接数
//      */
//     private int maxIdle = 32;
// 
//     /**
//      * 最小空闲连接数
//      */
//     private int minIdle = 10;
// 
//     public int getMaxTotal() {
//         return maxTotal;
//     }
// 
//     public void setMaxTotal(int maxTotal) {
//         this.maxTotal = maxTotal;
//     }
// 
//     public int getMaxIdle() {
//         return maxIdle;
//     }
// 
//     public void setMaxIdle(int maxIdle) {
//         this.maxIdle = maxIdle;
//     }
// 
//     public int getMinIdle() {
//         return minIdle;
//     }
// 
//     public void setMinIdle(int minIdle) {
//         this.minIdle = minIdle;
//     }
// 
//     @Override
//     public OureaObjectPoolConfig clone() {
// 
//         return (OureaObjectPoolConfig) super.clone();
// 
//     }
// }


import com.taocoder.ourea.core.consumer.ConsumerPoolFactory;
import com.taocoder.ourea.core.config.OureaObjectPoolConfig;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.pool2.ObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.apache.thrift.transport.TTransport;
import java.io.Serializable;
/*
 * Copyright (c) 2015 ketao1989.github.com. All Rights Reserved.
 */
package com.taocoder.ourea.core.model;



/**
 * 对于一个provider server的连接池对象.这个对象很重,所以需要缓存之后在使用
 * 
 * @author tao.ke Date: 16/3/3 Time: 下午2:35
 */
public class InvokeConn implements Serializable {

    private static final long serialVersionUID = -805739143582019252L;

    /**
     * 服务端的信息ip+port
     */
    private ProviderInfo providerInfo;

    /**
     * 和server端的连接池
     */
    private ObjectPool<TTransport> connPool;

    /**
     * 连接池相关配置
     */
    private OureaObjectPoolConfig poolConfig;

    public InvokeConn(ProviderInfo providerInfo, int timeout) {
        this(providerInfo, timeout, new OureaObjectPoolConfig());
    }

    public InvokeConn(ProviderInfo providerInfo, int timeout, OureaObjectPoolConfig poolConfig) {
        this.providerInfo = providerInfo;
        this.poolConfig = poolConfig;
// Path: ourea-core/src/main/java/com/taocoder/ourea/core/consumer/ConsumerPoolFactory.java
// public class ConsumerPoolFactory implements PooledObjectFactory<TTransport> {
// 
//     private static final Logger LOGGER = LoggerFactory.getLogger(ConsumerPoolFactory.class);
// 
//     /**
//      * 服务提供者的信息
//      */
//     private ProviderInfo providerInfo;
// 
//     /**
//      * 调用服务的超时时间
//      */
//     private int timeout;
// 
//     public ConsumerPoolFactory(ProviderInfo providerInfo, int timeout) {
//         this.providerInfo = providerInfo;
//         this.timeout = timeout;
//     }
// 
//     /**
//      * 这个地方创建连接的时候,如果创建失败,重试一次,还不行则抛出异常,把该节点暂时移除
//      * 
//      * @return
//      * @throws Exception
//      */
//     @Override
//     public PooledObject<TTransport> makeObject() throws Exception {
//         TTransport transport = null;
//         Exception ex = null;
//         int retryConn = 1;
//         do {
//             try {
//                 transport = new TSocket(providerInfo.getIp(), providerInfo.getPort(), timeout);
//                 transport.open();
//                 ((TSocket) transport).setTimeout(timeout);
//                 return new DefaultPooledObject<TTransport>(transport);
//             } catch (Exception e) {
//                 ex = e;
//             }
//         } while (retryConn-- > 0);
//         LOGGER.error("make transport object fail.e:", ex);
//         throw new OureaConnCreateException("make transport object fail." + ex.getMessage());
//     }
// 
//     @Override
//     public void destroyObject(PooledObject<TTransport> p) throws Exception {
// 
//         try {
//             TTransport transport = p.getObject();
//             if (transport.isOpen()) {
//                 transport.close();
//             }
//         } catch (Exception e) {
//             LOGGER.error("destroy transport object fail.maybe exist memory leek.e:", e);
//             throw new OureaException("destroy transport object fail" + e.getMessage());
//         }
// 
//     }
// 
//     @Override
//     public boolean validateObject(PooledObject<TTransport> p) {
//         if (p.getObject().isOpen()) {
//             return true;
//         }
//         return false;
//     }
// 
//     @Override
//     public void activateObject(PooledObject<TTransport> p) throws Exception {
// 
//     }
// 
//     @Override
//     public void passivateObject(PooledObject<TTransport> p) throws Exception {
// 
//     }
// }
// 
// Path: ourea-core/src/main/java/com/taocoder/ourea/core/config/OureaObjectPoolConfig.java
// public class OureaObjectPoolConfig extends GenericObjectPoolConfig {
// 
//     /**
//      * 最大连接数
//      */
//     private int maxTotal = 100;
// 
//     /**
//      * 最大空闲连接数
//      */
//     private int maxIdle = 32;
// 
//     /**
//      * 最小空闲连接数
//      */
//     private int minIdle = 10;
// 
//     public int getMaxTotal() {
//         return maxTotal;
//     }
// 
//     public void setMaxTotal(int maxTotal) {
//         this.maxTotal = maxTotal;
//     }
// 
//     public int getMaxIdle() {
//         return maxIdle;
//     }
// 
//     public void setMaxIdle(int maxIdle) {
//         this.maxIdle = maxIdle;
//     }
// 
//     public int getMinIdle() {
//         return minIdle;
//     }
// 
//     public void setMinIdle(int minIdle) {
//         this.minIdle = minIdle;
//     }
// 
//     @Override
//     public OureaObjectPoolConfig clone() {
// 
//         return (OureaObjectPoolConfig) super.clone();
// 
//     }
// }


// Path: ourea-core/src/main/java/com/taocoder/ourea/core/model/InvokeConn.java
import com.taocoder.ourea.core.consumer.ConsumerPoolFactory;
import com.taocoder.ourea.core.config.OureaObjectPoolConfig;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.pool2.ObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.apache.thrift.transport.TTransport;
import java.io.Serializable;

/*
 * Copyright (c) 2015 ketao1989.github.com. All Rights Reserved.
 */
package com.taocoder.ourea.core.model;



/**
 * 对于一个provider server的连接池对象.这个对象很重,所以需要缓存之后在使用
 * 
 * @author tao.ke Date: 16/3/3 Time: 下午2:35
 */
public class InvokeConn implements Serializable {

    private static final long serialVersionUID = -805739143582019252L;

    /**
     * 服务端的信息ip+port
     */
    private ProviderInfo providerInfo;

    /**
     * 和server端的连接池
     */
    private ObjectPool<TTransport> connPool;

    /**
     * 连接池相关配置
     */
    private OureaObjectPoolConfig poolConfig;

    public InvokeConn(ProviderInfo providerInfo, int timeout) {
        this(providerInfo, timeout, new OureaObjectPoolConfig());
    }

    public InvokeConn(ProviderInfo providerInfo, int timeout, OureaObjectPoolConfig poolConfig) {
        this.providerInfo = providerInfo;
        this.poolConfig = poolConfig;
        this.connPool = new GenericObjectPool<TTransport>(new ConsumerPoolFactory(providerInfo, timeout), poolConfig);