@Override
 protected void doStop() throws Exception {
   if (connectionManager != null) {
     // It releases the zookeeper connection when calling the shutdown method
     connectionManager.shutdown();
   }
 }
  public void process(Exchange exchange) throws Exception {

    ZooKeeper connection = zkm.getConnection();
    ProductionContext context = new ProductionContext(connection, exchange);

    String operation =
        exchange.getIn().getHeader(ZooKeeperMessage.ZOOKEEPER_OPERATION, String.class);
    boolean isDelete = ZK_OPERATION_DELETE.equals(operation);

    if (ExchangeHelper.isOutCapable(exchange)) {
      if (isDelete) {
        if (log.isDebugEnabled()) {
          log.debug(format("Deleting znode '%s', waiting for confirmation", context.node));
        }

        OperationResult result = synchronouslyDelete(context);
        if (configuration.listChildren()) {
          result = listChildren(context);
        }
        updateExchangeWithResult(context, result);
      } else {
        if (log.isDebugEnabled()) {
          log.debug(format("Storing data to znode '%s', waiting for confirmation", context.node));
        }

        OperationResult result = synchronouslySetData(context);
        if (configuration.listChildren()) {
          result = listChildren(context);
        }
        updateExchangeWithResult(context, result);
      }
    } else {
      if (isDelete) {
        asynchronouslyDeleteNode(connection, context);
      } else {
        asynchronouslySetDataOnNode(connection, context);
      }
    }
  }