private DefaultServiceClient(
     GraphName nodeName,
     ServiceDeclaration serviceDeclaration,
     MessageFactory messageFactory,
     ScheduledExecutorService executorService)
     throws IOException {
   this.serviceDeclaration = serviceDeclaration;
   this.messageFactory = messageFactory;
   messageBufferPool = new MessageBufferPool();
   responseListeners = new LinkedList<ServiceResponseListener<S>>();
   connectionHeader = new ConnectionHeader();
   connectionHeader.addField(ConnectionHeaderFields.CALLER_ID, nodeName.toString());
   // TODO(damonkohler): Support non-persistent connections.
   connectionHeader.addField(ConnectionHeaderFields.PERSISTENT, "1");
   connectionHeader.merge(serviceDeclaration.toConnectionHeader());
   tcpClientManager = TcpClientManager.getInstance(executorService);
   ServiceClientHandshakeHandler<T, S> serviceClientHandshakeHandler =
       new ServiceClientHandshakeHandler<T, S>(
           connectionHeader, responseListeners, executorService);
   handshakeLatch = new HandshakeLatch();
   serviceClientHandshakeHandler.addListener(handshakeLatch);
   tcpClientManager.addNamedChannelHandler(serviceClientHandshakeHandler);
 }
 @Override
 public T newMessage() {
   return messageFactory.newFromType(serviceDeclaration.getType());
 }
 @Override
 public GraphName getName() {
   return serviceDeclaration.getName();
 }