// Path: src/main/java/com/baidu/unbiz/multiengine/exception/MultiEngineException.java
// public class MultiEngineException extends RuntimeException {
// 
//     /**
//      * serialVersionUID
//      */
//     private static final long serialVersionUID = 2396421433506179782L;
// 
//     /**
//      * Creates a new instance of CodecException.
//      */
//     public MultiEngineException() {
//         super();
//     }
// 
//     /**
//      * Creates a new instance of CodecException.
//      *
//      * @param arg0
//      * @param arg1
//      */
//     public MultiEngineException(String arg0, Throwable arg1) {
//         super(arg0, arg1);
//     }
// 
//     /**
//      * Creates a new instance of CodecException.
//      *
//      * @param arg0
//      */
//     public MultiEngineException(String arg0) {
//         super(arg0);
//     }
// 
//     /**
//      * Creates a new instance of CodecException.
//      *
//      * @param arg0
//      */
//     public MultiEngineException(Throwable arg0) {
//         super(arg0);
//     }
// 
// }
// 
// Path: src/main/java/com/baidu/unbiz/multiengine/transport/client/TaskClient.java
// public final class TaskClient extends AbstractTaskClient {
// 
//     private static final Logger LOG = AopLogFactory.getLogger(TaskClient.class);
// 
//     private CountDownLatch initDone = new CountDownLatch(1);
//     private AtomicBoolean initSuccess = new AtomicBoolean(true);
//     private TaskClientStatus status = new TaskClientStatus();
// 
//     public <T> T call(TaskCommand command) {
//         return (T) syncSend(command);
//     }
// 
//     public SendFuture asyncCall(TaskCommand request) {
//         return asyncSend(request);
//     }
// 
//     public boolean heartBeat(HeartbeatInfo hbi) {
//         Signal<HeartbeatInfo> signal = new Signal<HeartbeatInfo>();
//         signal.setType(SignalType.HEART_BEAT);
//         try {
//             syncSend(signal, hbi.getTimeout(), TimeUnit.MILLISECONDS);
//         } catch (TimeoutException e) {
//             return false;
//         } catch (InterruptedException e) {
//             return false;
//         }
//         return true;
//     }
// 
//     public void syncGossip() {
//         Signal<GossipSync> signal = new Signal<GossipSync>();
//         signal.setType(SignalType.GOSSIP_SYNC);
//         try {
//             onewaySend(signal);
//         } catch (Exception e) {
//             LOG.warn("sync gossip:", e);
//         }
//     }
// 
//     public boolean restart() {
//         this.stop();
//         initDone = new CountDownLatch(1);
//         initSuccess.set(false);
//         return start();
//     }
// 
//     public boolean start() {
//         final AbstractTaskClient client = this;
//         new Thread() {
//             @Override
//             public void run() {
//                 try {
//                     client.doStart();
//                 } catch (Exception e) {
//                     LOG.error("client start fail:", e);
//                 }
//             }
//         }.start();
// 
//         try {
//             initDone.await();
//         } catch (InterruptedException e) {
//             LOG.error("client await fail:" + client.getHostConf());
//             initSuccess.set(false);
//         }
//         return initSuccess.get();
//     }
// 
//     public void stop() {
//         Channel channel = TaskClientContext.sessionChannelMap.get(sessionKey);
//         if (channel == null) {
//             return;
//         }
//         channel.close();
//     }
// 
//     public void callbackOnException(Exception e) {
//         LOG.error("client start fail:", e);
//         initSuccess.set(false);
//         initDone.countDown();
//     }
// 
//     public TaskClient() {
//     }
// 
//     public TaskClient(HostConf hostConf) {
//         this.hostConf = hostConf;
//     }
// 
//     public void callbackPostInit() {
//         initDone.countDown();
//     }
// 
//     public AtomicBoolean getInvalid() {
//         return status.getInvalid();
//     }
// 
//     public boolean isInvalid() {
//         return status.getInvalid().get();
//     }
// 
//     public void setInvalid(AtomicBoolean invalid) {
//         this.status.setInvalid(invalid);
//     }
// 
//     public void setInvalid(boolean invalid) {
//         this.status.getInvalid().set(invalid);
//     }
// 
//     public boolean initSuccess() {
//         return initSuccess.get();
//     }
// }
// 
// Path: src/main/java/com/baidu/unbiz/multiengine/transport/client/TaskClientFactory.java
// public class TaskClientFactory {
// 
//     private static SessionIdProvider idProvider = new DefaultSessionIdProvider("TaskClient");
// 
//     public static TaskClient createTaskClient(HostConf hostConf) {
//         TaskClient taskClient = new TaskClient(hostConf);
//         taskClient.setIdGen(new SequenceIdGen());
//         String sessionKey = idProvider.getSessionId(true);
//         taskClient.setSessionKey(sessionKey);
//         TaskClientContext.sessionClientMap.putIfAbsent(sessionKey, taskClient);
//         return taskClient;
//     }
// }


import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.springframework.util.Assert;
import com.baidu.unbiz.multiengine.exception.MultiEngineException;
import com.baidu.unbiz.multiengine.transport.client.TaskClient;
import com.baidu.unbiz.multiengine.transport.client.TaskClientFactory;
import com.baidu.unbiz.multitask.log.AopLogFactory;
package com.baidu.unbiz.multiengine.endpoint;




/**
 * Created by wangchongjie on 16/4/14.
 */
public class EndpointPool {
    private static final Logger LOG = AopLogFactory.getLogger(EndpointPool.class);

    private static List<TaskClient> pool = new CopyOnWriteArrayList<TaskClient>();
// Path: src/main/java/com/baidu/unbiz/multiengine/exception/MultiEngineException.java
// public class MultiEngineException extends RuntimeException {
// 
//     /**
//      * serialVersionUID
//      */
//     private static final long serialVersionUID = 2396421433506179782L;
// 
//     /**
//      * Creates a new instance of CodecException.
//      */
//     public MultiEngineException() {
//         super();
//     }
// 
//     /**
//      * Creates a new instance of CodecException.
//      *
//      * @param arg0
//      * @param arg1
//      */
//     public MultiEngineException(String arg0, Throwable arg1) {
//         super(arg0, arg1);
//     }
// 
//     /**
//      * Creates a new instance of CodecException.
//      *
//      * @param arg0
//      */
//     public MultiEngineException(String arg0) {
//         super(arg0);
//     }
// 
//     /**
//      * Creates a new instance of CodecException.
//      *
//      * @param arg0
//      */
//     public MultiEngineException(Throwable arg0) {
//         super(arg0);
//     }
// 
// }
// 
// Path: src/main/java/com/baidu/unbiz/multiengine/transport/client/TaskClient.java
// public final class TaskClient extends AbstractTaskClient {
// 
//     private static final Logger LOG = AopLogFactory.getLogger(TaskClient.class);
// 
//     private CountDownLatch initDone = new CountDownLatch(1);
//     private AtomicBoolean initSuccess = new AtomicBoolean(true);
//     private TaskClientStatus status = new TaskClientStatus();
// 
//     public <T> T call(TaskCommand command) {
//         return (T) syncSend(command);
//     }
// 
//     public SendFuture asyncCall(TaskCommand request) {
//         return asyncSend(request);
//     }
// 
//     public boolean heartBeat(HeartbeatInfo hbi) {
//         Signal<HeartbeatInfo> signal = new Signal<HeartbeatInfo>();
//         signal.setType(SignalType.HEART_BEAT);
//         try {
//             syncSend(signal, hbi.getTimeout(), TimeUnit.MILLISECONDS);
//         } catch (TimeoutException e) {
//             return false;
//         } catch (InterruptedException e) {
//             return false;
//         }
//         return true;
//     }
// 
//     public void syncGossip() {
//         Signal<GossipSync> signal = new Signal<GossipSync>();
//         signal.setType(SignalType.GOSSIP_SYNC);
//         try {
//             onewaySend(signal);
//         } catch (Exception e) {
//             LOG.warn("sync gossip:", e);
//         }
//     }
// 
//     public boolean restart() {
//         this.stop();
//         initDone = new CountDownLatch(1);
//         initSuccess.set(false);
//         return start();
//     }
// 
//     public boolean start() {
//         final AbstractTaskClient client = this;
//         new Thread() {
//             @Override
//             public void run() {
//                 try {
//                     client.doStart();
//                 } catch (Exception e) {
//                     LOG.error("client start fail:", e);
//                 }
//             }
//         }.start();
// 
//         try {
//             initDone.await();
//         } catch (InterruptedException e) {
//             LOG.error("client await fail:" + client.getHostConf());
//             initSuccess.set(false);
//         }
//         return initSuccess.get();
//     }
// 
//     public void stop() {
//         Channel channel = TaskClientContext.sessionChannelMap.get(sessionKey);
//         if (channel == null) {
//             return;
//         }
//         channel.close();
//     }
// 
//     public void callbackOnException(Exception e) {
//         LOG.error("client start fail:", e);
//         initSuccess.set(false);
//         initDone.countDown();
//     }
// 
//     public TaskClient() {
//     }
// 
//     public TaskClient(HostConf hostConf) {
//         this.hostConf = hostConf;
//     }
// 
//     public void callbackPostInit() {
//         initDone.countDown();
//     }
// 
//     public AtomicBoolean getInvalid() {
//         return status.getInvalid();
//     }
// 
//     public boolean isInvalid() {
//         return status.getInvalid().get();
//     }
// 
//     public void setInvalid(AtomicBoolean invalid) {
//         this.status.setInvalid(invalid);
//     }
// 
//     public void setInvalid(boolean invalid) {
//         this.status.getInvalid().set(invalid);
//     }
// 
//     public boolean initSuccess() {
//         return initSuccess.get();
//     }
// }
// 
// Path: src/main/java/com/baidu/unbiz/multiengine/transport/client/TaskClientFactory.java
// public class TaskClientFactory {
// 
//     private static SessionIdProvider idProvider = new DefaultSessionIdProvider("TaskClient");
// 
//     public static TaskClient createTaskClient(HostConf hostConf) {
//         TaskClient taskClient = new TaskClient(hostConf);
//         taskClient.setIdGen(new SequenceIdGen());
//         String sessionKey = idProvider.getSessionId(true);
//         taskClient.setSessionKey(sessionKey);
//         TaskClientContext.sessionClientMap.putIfAbsent(sessionKey, taskClient);
//         return taskClient;
//     }
// }


// Path: src/main/java/com/baidu/unbiz/multiengine/endpoint/EndpointPool.java
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.springframework.util.Assert;
import com.baidu.unbiz.multiengine.exception.MultiEngineException;
import com.baidu.unbiz.multiengine.transport.client.TaskClient;
import com.baidu.unbiz.multiengine.transport.client.TaskClientFactory;
import com.baidu.unbiz.multitask.log.AopLogFactory;

package com.baidu.unbiz.multiengine.endpoint;




/**
 * Created by wangchongjie on 16/4/14.
 */
public class EndpointPool {
    private static final Logger LOG = AopLogFactory.getLogger(EndpointPool.class);

    private static List<TaskClient> pool = new CopyOnWriteArrayList<TaskClient>();
    private static TaskClientFactory clientFactory = new TaskClientFactory();