public void callMethod(
      MethodDescriptor method,
      RpcController controller,
      Message request,
      Message responsePrototype,
      RpcCallback<Message> done) {
    ClientRpcController rpcController = (ClientRpcController) controller;

    int correlationId = getNextCorrelationId();
    rpcController.setCorrelationId(correlationId);

    PendingClientCallState state =
        new PendingClientCallState(rpcController, method, responsePrototype, request, done);
    registerPendingRequest(correlationId, state);

    RpcRequest rpcRequest =
        RpcRequest.newBuilder()
            .setCorrelationId(correlationId)
            .setServiceIdentifier(state.getServiceIdentifier())
            .setMethodIdentifier(state.getMethodIdentifier())
            .setRequestBytes(request.toByteString())
            .build();

    if (channel.isConnected()) {
      if (LOGGER.isDebugEnabled())
        //				LOGGER.debug("Sending ["+rpcRequest.getCorrelationId()+"]RpcRequest.");
        LOGGER.debug(
            "Sending [" + rpcRequest.getCorrelationId() + "]RpcRequest. signature {}",
            state.getMethodDesc().getFullName());
      WirePayload payload = WirePayload.newBuilder().setRpcRequest(rpcRequest).build();
      channel.write(payload);
    } else {
      LOGGER.error("Sending [" + rpcRequest.getCorrelationId() + "]RpcRequest. FAILURE");
      String errorMessage = "Session [" + channel + "]closed";
      RpcError rpcError =
          RpcError.newBuilder()
              .setCorrelationId(correlationId)
              .setErrorMessage(errorMessage)
              .build();
      error(rpcError);
      doLog(state, rpcError, errorMessage);
    }
  }
 public void handleFailure(String message) {
   controller.setFailed(message);
   callback(null);
 }