public void onReceived(
        Executor executor,
        final String path,
        final int version,
        final String id,
        final Message message) {
      if (callback == null) {
        // Simply delete the message
        if (LOG.isDebugEnabled()) {
          LOG.debug("Ignoring incoming message from " + path + ": " + message);
        }
        listenFailure(zkClient.delete(path, version));
        return;
      }

      executor.execute(
          new Runnable() {
            @Override
            public void run() {
              try {
                // Message process is synchronous for now. Making it async needs more thoughts about
                // race conditions.
                // The executor is the callbackExecutor which is a single thread executor.
                callback.onReceived(id, message).get();
              } catch (Throwable t) {
                LOG.error("Exception when processing message: {}, {}, {}", id, message, path, t);
              } finally {
                listenFailure(zkClient.delete(path, version));
              }
            }
          });
    }
 private OperationFuture<String> removeLiveNode() {
   String liveNode = getLiveNodePath();
   LOG.info("Remove live node {}{}", zkClient.getConnectString(), liveNode);
   return ZKOperations.ignoreError(
       zkClient.delete(liveNode), KeeperException.NoNodeException.class, liveNode);
 }