// Path: ourea-core/src/main/java/com/taocoder/ourea/core/common/PropertiesUtils.java
// public class PropertiesUtils {
// 
//     public static Properties load(String fileName) {
// 
//         InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
//         return load(is);
//     }
// 
//     public static Properties load(InputStream is) {
// 
//         Properties properties = new Properties();
//         try {
//             properties.load(is);
//         } catch (IOException e) {
//             e.printStackTrace();
//             throw new IllegalArgumentException(e.getMessage());
//         }
//         return properties;
//     }
// 
// }
// 
// Path: ourea-core/src/main/java/com/taocoder/ourea/core/config/ZkConfig.java
// public class ZkConfig {
// 
//     /**
//      * zk ip:port,
//      */
//     private String zkAddress;
// 
//     /**
//      * zk 超时时间
//      */
//     private int zkTimeout = 3000;
// 
//     /**
//      * 重试之间初始等待时间
//      */
//     private int baseSleepTimeMs = 10;
// 
//     /**
//      * 重试之间最长等待时间
//      */
//     private int maxSleepTimeMs = 1000;
// 
//     /**
//      * 重试次数
//      */
//     private int maxRetries = 3;
// 
//     public ZkConfig() {
//     }
// 
//     public ZkConfig(String zkAddress) {
//         this.zkAddress = zkAddress;
//     }
// 
//     public void setZkAddress(String zkAddress) {
//         this.zkAddress = zkAddress;
//     }
// 
//     public String getZkAddress() {
//         return zkAddress;
//     }
// 
//     public int getZkTimeout() {
//         return zkTimeout;
//     }
// 
//     public void setZkTimeout(int zkTimeout) {
//         this.zkTimeout = zkTimeout;
//     }
// 
//     public int getBaseSleepTimeMs() {
//         return baseSleepTimeMs;
//     }
// 
//     public void setBaseSleepTimeMs(int baseSleepTimeMs) {
//         this.baseSleepTimeMs = baseSleepTimeMs;
//     }
// 
//     public int getMaxSleepTimeMs() {
//         return maxSleepTimeMs;
//     }
// 
//     public void setMaxSleepTimeMs(int maxSleepTimeMs) {
//         this.maxSleepTimeMs = maxSleepTimeMs;
//     }
// 
//     public int getMaxRetries() {
//         return maxRetries;
//     }
// 
//     public void setMaxRetries(int maxRetries) {
//         this.maxRetries = maxRetries;
//     }
// 
// }
// 
// Path: ourea-core/src/main/java/com/taocoder/ourea/core/consumer/ConsumerProxyFactory.java
// public class ConsumerProxyFactory {
// 
//     private static final Logger LOGGER = LoggerFactory.getLogger(ConsumerProxyFactory.class);
// 
//     /**
//      * 正常的业务需求,是保证全局的thrift client 单例的,因为构造client成本是很重的. 这里的,key为class_group_version
//      */
//     private static final ConcurrentHashMap<String, Object> SERVICE_CLIENT_CONCURRENT_HASH_MAP = new ConcurrentHashMap<String, Object>();
// 
//     private static final Joiner CLIENT_KEY_JOINER = Joiner.on("_");
// 
//     private static final Object SERVICE_CLIENT_LOCK = new Object();
// 
//     public <T> T getProxyClient(Class<T> clientClazz, ZkConfig zkConfig) {
//         return getProxyClient(clientClazz, new ThriftClientConfig(), zkConfig);
//     }
// 
//     @SuppressWarnings("unchecked")
//     public <T> T getProxyClient(Class<T> clientClazz, ThriftClientConfig config, ZkConfig zkConfig) {
// 
//         String clientKey = CLIENT_KEY_JOINER.join(clientClazz.getCanonicalName(), config.getGroup(),
//                 config.getVersion());
//         T client = (T) SERVICE_CLIENT_CONCURRENT_HASH_MAP.get(clientKey);
// 
//         if (client == null) {
//             synchronized (SERVICE_CLIENT_LOCK) {
//                 client = (T) SERVICE_CLIENT_CONCURRENT_HASH_MAP.get(clientKey);
//                 if (client == null) {
// 
//                     long start = System.currentTimeMillis();
//                     final ServiceInfo serviceInfo = new ServiceInfo(clientClazz, config.getVersion(),
//                             config.getGroup());
// 
//                     client = (T) Proxy.newProxyInstance(ConsumerProxyFactory.class.getClassLoader(),
//                             new Class[] { clientClazz }, new ConsumerProxy(serviceInfo, zkConfig, config));
//                     SERVICE_CLIENT_CONCURRENT_HASH_MAP.putIfAbsent(clientKey, client);
//                     LOGGER.info("build thrift client succ.cost:{},clientConfig:{},zkConfig:{}",
//                             System.currentTimeMillis() - start, config, zkConfig);
//                 }
//             }
//         }
//         return client;
//     }
// 
// }


import java.util.Properties;
import com.taocoder.ourea.core.common.PropertiesUtils;
import com.taocoder.ourea.core.config.ZkConfig;
import com.taocoder.ourea.core.consumer.ConsumerProxyFactory;
/*
 * Copyright (c) 2015 taocoder.com. All Rights Reserved.
 */
package com.taocoder.ourea;



/**
 * @author tao.ke Date: 16/4/27 Time: 下午5:03
 */
public class ZkThriftClientSample {

    public static void main(String[] args) throws Exception {

        Properties properties = PropertiesUtils.load("consumer.properties");

        ConsumerProxyFactory factory = new ConsumerProxyFactory();

// Path: ourea-core/src/main/java/com/taocoder/ourea/core/common/PropertiesUtils.java
// public class PropertiesUtils {
// 
//     public static Properties load(String fileName) {
// 
//         InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
//         return load(is);
//     }
// 
//     public static Properties load(InputStream is) {
// 
//         Properties properties = new Properties();
//         try {
//             properties.load(is);
//         } catch (IOException e) {
//             e.printStackTrace();
//             throw new IllegalArgumentException(e.getMessage());
//         }
//         return properties;
//     }
// 
// }
// 
// Path: ourea-core/src/main/java/com/taocoder/ourea/core/config/ZkConfig.java
// public class ZkConfig {
// 
//     /**
//      * zk ip:port,
//      */
//     private String zkAddress;
// 
//     /**
//      * zk 超时时间
//      */
//     private int zkTimeout = 3000;
// 
//     /**
//      * 重试之间初始等待时间
//      */
//     private int baseSleepTimeMs = 10;
// 
//     /**
//      * 重试之间最长等待时间
//      */
//     private int maxSleepTimeMs = 1000;
// 
//     /**
//      * 重试次数
//      */
//     private int maxRetries = 3;
// 
//     public ZkConfig() {
//     }
// 
//     public ZkConfig(String zkAddress) {
//         this.zkAddress = zkAddress;
//     }
// 
//     public void setZkAddress(String zkAddress) {
//         this.zkAddress = zkAddress;
//     }
// 
//     public String getZkAddress() {
//         return zkAddress;
//     }
// 
//     public int getZkTimeout() {
//         return zkTimeout;
//     }
// 
//     public void setZkTimeout(int zkTimeout) {
//         this.zkTimeout = zkTimeout;
//     }
// 
//     public int getBaseSleepTimeMs() {
//         return baseSleepTimeMs;
//     }
// 
//     public void setBaseSleepTimeMs(int baseSleepTimeMs) {
//         this.baseSleepTimeMs = baseSleepTimeMs;
//     }
// 
//     public int getMaxSleepTimeMs() {
//         return maxSleepTimeMs;
//     }
// 
//     public void setMaxSleepTimeMs(int maxSleepTimeMs) {
//         this.maxSleepTimeMs = maxSleepTimeMs;
//     }
// 
//     public int getMaxRetries() {
//         return maxRetries;
//     }
// 
//     public void setMaxRetries(int maxRetries) {
//         this.maxRetries = maxRetries;
//     }
// 
// }
// 
// Path: ourea-core/src/main/java/com/taocoder/ourea/core/consumer/ConsumerProxyFactory.java
// public class ConsumerProxyFactory {
// 
//     private static final Logger LOGGER = LoggerFactory.getLogger(ConsumerProxyFactory.class);
// 
//     /**
//      * 正常的业务需求,是保证全局的thrift client 单例的,因为构造client成本是很重的. 这里的,key为class_group_version
//      */
//     private static final ConcurrentHashMap<String, Object> SERVICE_CLIENT_CONCURRENT_HASH_MAP = new ConcurrentHashMap<String, Object>();
// 
//     private static final Joiner CLIENT_KEY_JOINER = Joiner.on("_");
// 
//     private static final Object SERVICE_CLIENT_LOCK = new Object();
// 
//     public <T> T getProxyClient(Class<T> clientClazz, ZkConfig zkConfig) {
//         return getProxyClient(clientClazz, new ThriftClientConfig(), zkConfig);
//     }
// 
//     @SuppressWarnings("unchecked")
//     public <T> T getProxyClient(Class<T> clientClazz, ThriftClientConfig config, ZkConfig zkConfig) {
// 
//         String clientKey = CLIENT_KEY_JOINER.join(clientClazz.getCanonicalName(), config.getGroup(),
//                 config.getVersion());
//         T client = (T) SERVICE_CLIENT_CONCURRENT_HASH_MAP.get(clientKey);
// 
//         if (client == null) {
//             synchronized (SERVICE_CLIENT_LOCK) {
//                 client = (T) SERVICE_CLIENT_CONCURRENT_HASH_MAP.get(clientKey);
//                 if (client == null) {
// 
//                     long start = System.currentTimeMillis();
//                     final ServiceInfo serviceInfo = new ServiceInfo(clientClazz, config.getVersion(),
//                             config.getGroup());
// 
//                     client = (T) Proxy.newProxyInstance(ConsumerProxyFactory.class.getClassLoader(),
//                             new Class[] { clientClazz }, new ConsumerProxy(serviceInfo, zkConfig, config));
//                     SERVICE_CLIENT_CONCURRENT_HASH_MAP.putIfAbsent(clientKey, client);
//                     LOGGER.info("build thrift client succ.cost:{},clientConfig:{},zkConfig:{}",
//                             System.currentTimeMillis() - start, config, zkConfig);
//                 }
//             }
//         }
//         return client;
//     }
// 
// }


// Path: ourea-core/src/test/java/com/taocoder/ourea/ZkThriftClientSample.java
import java.util.Properties;
import com.taocoder.ourea.core.common.PropertiesUtils;
import com.taocoder.ourea.core.config.ZkConfig;
import com.taocoder.ourea.core.consumer.ConsumerProxyFactory;

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



/**
 * @author tao.ke Date: 16/4/27 Time: 下午5:03
 */
public class ZkThriftClientSample {

    public static void main(String[] args) throws Exception {

        Properties properties = PropertiesUtils.load("consumer.properties");

        ConsumerProxyFactory factory = new ConsumerProxyFactory();

        final Ourea.Iface client = factory.getProxyClient(Ourea.Iface.class,