@Override
  public void onMessage(final String message) {
    try {
      AbstractMessage msg = (AbstractMessage) (new XMLBuilder().fromXML(message));
      final int requestID = msg.getId();
      String messageType = msg.getType();
      final String destination = msg.getEndpoint();
      switch (messageType) {
        case "request":
          {
            if (DEBUG) System.out.println("Receiving the request: \n" + message);
            final Request request = (Request) msg;
            executors.submit(
                new Callable<Object>() {

                  @Override
                  public Object call() throws Exception {
                    try {

                      Object result = invokeOperation(request.getOpName(), request.getParams());

                      if (result instanceof OperationAborted) return null;
                      sendResponse(requestID, result, destination);

                    } catch (Exception e) {
                      e.printStackTrace();
                    }

                    return null;
                  }
                });
            break;
          }
        case "response":
          {
            if (DEBUG) System.out.println("Receiving the response: \n" + message);
            Response response = (Response) msg;
            if (response.getReturnType() != null) {
              Class<?> type = (Class<?>) response.getReturnType();
              results.put(response.getRequestID(), type.cast(response.getReturnValue()));
            } else {
              results.put(response.getRequestID(), NullObject);
            }
            synchronized (this) {
              this.notifyAll();
            }
            break;
          }
        default:
          break;
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }