Example #1
0
        protected virtual async Task LoadConsumer()
        {
            int idleCount = 0;

            await Task.Delay(1000);

            while (_ConsumerStatus != ConsumerStatus.DISPOSE)
            {
                try
                {
                    while (_ConsumerStatus == ConsumerStatus.OFFLINE)
                    {
                        await Task.Delay(1000);
                    }
                    ;

                    var objects = GetObjectsFromQueue(MaxMemoryQueueObjects - MemoryQueue.Count);

                    if (objects.NullOrEmpty())
                    {
                        idleCount++;

                        if (_ConsumerStatus == ConsumerStatus.ONLINE_IDLE)
                        {
                            var waitingTime = idleCount * SCHEDULE_BASE_IDLE_TIME;
                            if (waitingTime >= SCHEDULE_MAX_IDLE_TIME)
                            {
                                waitingTime = SCHEDULE_BASE_IDLE_TIME;
                            }
                            await Task.Delay(waitingTime);
                        }
                        else
                        {
                            if (_ConsumerStatus == ConsumerStatus.ONLINE && idleCount >= 25)
                            {
                                _ConsumerStatus = ConsumerStatus.ONLINE_IDLE;
                            }
                        }
                    }
                    else
                    {
                        idleCount       = 0;
                        _ConsumerStatus = ConsumerStatus.ONLINE;
                        MemoryQueue.EnqueueRange(objects);
                    }
                }
                catch (Exception ex)
                {
                    Log.Error($"Consumer from ThreadGroup '{this.ThreadGroup}' and ThreadGuid:'{this.ThreadGuid}  could not get objects from queue.", exception: ex);
                    _ConsumerStatus = ConsumerStatus.ONLINE_IDLE;
                }
            }
        }