private synchronized void handler(final IMessageHandler h) {
   onDispose.add(
       new Runnable() {
         @Override
         public void run() {
           mc.removeMessageHandler(h);
         }
       });
   mc.addMessageHandler(h);
 }
 public synchronized void dispose() {
   try {
     if (mc != null) {
       sendStatus(mc.getChannel(), "unavailable", "Shutdown");
       for (Runnable r : onDispose) {
         r.run();
       }
     }
     mc = null;
   } catch (Exception e) {
     e.printStackTrace();
   }
 }
 private void sendStatus(String user, String status, String error) {
   try {
     JSONObject msg = new JSONObject();
     msg.put("username", user);
     msg.put("service", serviceTypeId);
     msg.put("status", status);
     if (error != null) {
       msg.put("error", error);
     }
     mc.send(SERVICE_STATUS_CHANGE, msg);
   } catch (Exception e) {
     e.printStackTrace();
   }
 }
  public ServiceDiscoveryConnector(
      IMessagingConnector messagingConnector, String serviceTypeId, boolean keepAlive) {
    this.mc = messagingConnector;
    this.serviceTypeId = serviceTypeId;

    this.mc.addChannelListener(channelListener);

    String userChannel = mc.getChannel();
    if (userChannel != null) {
      sendStatus(userChannel, "ready");
    }

    handler(
        new AbstractMessageHandler(DISCOVER_SERVICE_REQUEST) {
          @Override
          public void handleMessage(String messageType, JSONObject message) {
            String user = mc.getChannel();
            try {
              if (forMe(message)
                  && (message.get("username").equals(user) || Constants.SUPER_USER.equals(user))) {
                JSONObject response = new JSONObject(message, COPY_PROPS);
                response.put(
                    "status", message.get("username").equals(user) ? "ready" : "available");
                mc.send(DISCOVER_SERVICE_RESPONSE, response);
              }
            } catch (Exception e) {
              throw new Error(e);
            }
          }
        });

    this.mc.addMessageHandler(
        new AbstractMessageHandler(START_SERVICE_REQUEST) {

          @Override
          public void handleMessage(String messageType, JSONObject message) {
            mc.removeMessageHandler(this);
            try {
              String user = message.getString("username");
              JSONObject serviceStartedMessage = new JSONObject(message, COPY_PROPS);
              mc.send(START_SERVICE_RESPONSE, serviceStartedMessage);
              sendStatus(user, "starting");
              mc.connectChannel(user);
            } catch (JSONException e) {
              e.printStackTrace();
            }
          }
        });
  }
 @Override
 public void disconnected(String userChannel) {
   if (mc != null && mc.isConnected()) {
     sendStatus(userChannel, "unavailable", "Disconnected");
   }
 }