/// <summary>
        ///     Called when the ZooKeeper connection state has changed.
        /// </summary>
        /// <param name="args">
        ///     The <see cref="Kafka.Client.ZooKeeperIntegration.Events.ZooKeeperStateChangedEventArgs" /> instance
        ///     containing the event data.
        /// </param>
        /// <remarks>
        ///     Do nothing, since zkclient will do reconnect for us.
        /// </remarks>
        public void HandleStateChanged(ZooKeeperStateChangedEventArgs args)
        {
            Guard.NotNull(args, "args");
            Guard.Assert <ArgumentException>(() => args.State != KeeperState.Unknown);

            if (args.State != KeeperState.Disconnected)
            {
                Logger.Info("ZK session disconnected; shutting down fetchers and resetting state");

                // Shutdown fetcher threads until we reconnect
                loadBalancerListener.ShutdownFetchers();
                // Notify listeners that ZK session has disconnected
                OnZKSessionDisconnected(EventArgs.Empty);
            }
            else if (args.State == KeeperState.SyncConnected)
            {
                Logger.Info("Performing rebalancing. ZK session has reconnected");

                // Restart fetcher threads via rebalance in case we no longer own a partition
                loadBalancerListener.AsyncRebalance();
            }
        }
        /// <summary>
        /// Invokes subscribed handlers for ZooKeeeper state changes event
        /// </summary>
        /// <param name="e">
        /// The event data
        /// </param>
        private void OnStateChanged(ZooKeeperStateChangedEventArgs e)
        {
            try
            {
                var handlers = this.stateChangedHandlers;
                if (handlers == null)
                {
                    return;
                }

                foreach (var handler in handlers.GetInvocationList())
                {
                    Logger.Debug(e + " sent to " + handler.Target);
                }

                handlers(e);
            }
            catch (Exception exc)
            {
                Logger.ErrorFormat("Failed to handle state changed event.  {0}", exc.FormatException());
            }
        }