protected void fireReceiveQuery(final ISocketServerConnection ssc,
          IRemoteCallObjectMetaData meta, IRemoteCallObjectData data,
          final long connectionId, final long callId) throws Exception {
    //Exception tmpException = null;
    ExceptionList excl = new ExceptionList();
    //.
    try {
      Object result = null;
      // if receipt message KEEPALIVE, that nothing to do
      if (!meta.getExecCommand().equalsIgnoreCase(ISession.KEEPALIVE_MESSAGE)) {
        ssc.setLastAccessTime(new Date().getTime());

        // execute handler
        ConnectionInfo info = new ConnectionInfo(
                                  connectionId,
                                  ssc.getCreationTime(),
                                  ssc.getIdleTimeout(),
                                  ssc.getLastAccessTime(),
                                  ssc.getLastReceiptTime(),
                                  ssc.getRemoteIP(),
                                  ssc.getRemotePort());

        result = fireReceiveQueryEvent(new ReceiveQueryEvent(this, info,
                                                             meta.getExecCommand(),
                                                             data.getData()));
      }
      // set that it is answer to client
      meta = new RemoteCallObjectMetaData("Client.Answer <Call#" + callId + ">", RemoteCallObjectType.Respond);
      // put the result
      data.setData(result);
    }
    catch (Exception exc) {
      excl.add(exc);
      // set that it is error-answer to client
      meta = new RemoteCallObjectMetaData(null, RemoteCallObjectType.RespondError);
      // put the exception
      data.setData(exc);
    }

    // create, put and send result
    try {
      ssc.send(SerializeUtils.serializeToBytes(new RemoteCallObject(callId, meta, data)));
    }
    catch (Exception e) {
      byte sendData[] = null;

      // wrap exist exception
      excl.add(e);

      // set that it is error-answer to client
      meta = new RemoteCallObjectMetaData(null, RemoteCallObjectType.RespondError);
      
      data.setData(excl); // put exception
      try {
        // create and serialize object-answer
        sendData = SerializeUtils.serializeToBytes(new RemoteCallObject(callId, meta, data));
      }
      catch (Exception exc) {
        // put exception - text
        data.setData("fireReceiveQuery: " + exc.getMessage());
        sendData = SerializeUtils.serializeToBytes(new RemoteCallObject(callId, meta, data));
      }
      // send message with exception
      ssc.send(sendData);
    }
    // if was exception re-throw to above
    if (excl.size() > 0) throw new Exception(excl.get(0));
  }