@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(); } }