protected override void DoBeforeConsuming(ConsumerLeaseKey key, long correlationId)
 {
     ISchedulePolicy noEndpointSchedulePolicy = new ExponentialSchedulePolicy(Config.NoEndpointWaitBaseMillis, Config.NoEndpointWaitMaxMillis);
     pullMessagesTask.WriteFullFence(new DefaultPullMessagesTask(correlationId, noEndpointSchedulePolicy, this));
 }
        private void StartConsuming(ConsumerLeaseKey key, long correlationId)
        {
            ConsumerNotifier.Register(correlationId, Context);
            DoBeforeConsuming(key, correlationId);
            msgs.Clear();
            ISchedulePolicy noMessageSchedulePolicy = new ExponentialSchedulePolicy(Config.NoMessageWaitBaseMillis, Config.NoMessageWaitMaxMillis);

            while (!IsClosed() && !leaseRef.ReadFullFence().Expired)
            {

                try
                {
                    // if leaseRemainingTime < stopConsumerTimeMillsBeforLeaseExpired, stop
                    if (leaseRef.ReadFullFence().RemainingTime <= Config.StopConsumerTimeMillsBeforLeaseExpired)
                    {
                        break;
                    }

                    if (msgs.Count == 0)
                    {
                        SchedulePullMessagesTask();
                    }

                    if (msgs.Count != 0)
                    {
                        ConsumeMessages(correlationId);
                        noMessageSchedulePolicy.Succeess();
                    }
                    else
                    {
                        noMessageSchedulePolicy.Fail(true);
                    }

                }
                catch (Exception e)
                {
                    log.Error(string.Format("Exception occurred while consuming message(topic={0}, partition={1}, groupId={2}, sessionId={3})",
                            Context.Topic.Name, PartitionId, Context.GroupId, Context.SessionId), e);
                }
            }

            ConsumerNotifier.Deregister(correlationId);
            leaseRef.WriteFullFence(null);
            DoAfterConsuming(key, correlationId);
        }