protected final void watchInstanceNode() {
   if (!shouldProcessZKEvent()) {
     return;
   }
   Futures.addCallback(
       zkClient.getData(
           getInstancePath(),
           new Watcher() {
             @Override
             public void process(WatchedEvent event) {
               if (!shouldProcessZKEvent()) {
                 return;
               }
               switch (event.getType()) {
                 case NodeDataChanged:
                   watchInstanceNode();
                   break;
                 case NodeDeleted:
                   instanceNodeFailed(
                       KeeperException.create(KeeperException.Code.NONODE, getInstancePath()));
                   break;
                 default:
                   LOG.info("Ignore ZK event for instance node: {}", event);
               }
             }
           }),
       instanceNodeDataCallback,
       Threads.SAME_THREAD_EXECUTOR);
 }
 private void watchStateNode() {
   if (!shouldProcessZKEvent()) {
     return;
   }
   Futures.addCallback(
       zkClient.getData(
           getZKPath("state"),
           new Watcher() {
             @Override
             public void process(WatchedEvent event) {
               if (!shouldProcessZKEvent()) {
                 return;
               }
               switch (event.getType()) {
                 case NodeDataChanged:
                   watchStateNode();
                   break;
                 default:
                   LOG.debug("Ignore ZK event for state node: {}", event);
               }
             }
           }),
       stateNodeDataCallback,
       Threads.SAME_THREAD_EXECUTOR);
 }
  private void processMessage(final String path, final String messageId) {
    Futures.addCallback(
        zkClient.getData(path),
        new FutureCallback<NodeData>() {
          @Override
          public void onSuccess(NodeData result) {
            Message message = MessageCodec.decode(result.getData());
            if (message == null) {
              LOG.error("Failed to decode message for " + messageId + " in " + path);
              listenFailure(zkClient.delete(path, result.getStat().getVersion()));
              return;
            }
            if (LOG.isDebugEnabled()) {
              LOG.debug(
                  "Message received from "
                      + path
                      + ": "
                      + new String(MessageCodec.encode(message), Charsets.UTF_8));
            }
            if (handleStopMessage(
                message, getDeleteSupplier(path, result.getStat().getVersion()))) {
              return;
            }
            messageCallback.onReceived(
                callbackExecutor, path, result.getStat().getVersion(), messageId, message);
          }

          @Override
          public void onFailure(Throwable t) {
            LOG.error("Failed to fetch message content.", t);
          }
        });
  }