示例#1
0
        protected virtual void ProcessQueue(object state)
        {
            // если очередь переполнена, то почистим ее
            int maxSize     = Client.Config.Logs.WebLog.QueueBytes;
            int currentSize = LogQueue.Bytes();

            if (currentSize > maxSize)
            {
                Client.InternalLog.Warning("Очищаем очередь веб-логов");
                LogQueue.ClearBySize(maxSize / 2); // очищаем половину очереди
                Client.InternalLog.Debug("Очередь веб-логов очищена");
            }

            if (Disabled)
            {
                return;
            }

            if (LogQueue.Count() == 0)
            {
                return;
            }

            // если все потоки заняты, то ждем следующей итерации
            if (TaskQueue.HasFreeThreads == false)
            {
                return;
            }
            if (TaskQueue.RunTasks > 0)
            {
                return;
            }

            // если канал оффлайн, то ничего не отправляем
            if (Client.CanSendData == false)
            {
                return;
            }

            // если не можем вычислить разницу по времени, значит канал дохлый
            if (Client.CanConvertToServerDate() == false)
            {
                return;
            }

            // разбиваем все логи по пачкам и отправляем
            int batchSize = Client.Config.Logs.WebLog.BatchBytes;

            lock (LogQueue.SynchRoot)
            {
                // todo отправляются ВСЕ логи которые сейчас в очереди,
                // т.е. по факту в памяти будет логов = размер очереди * 2 (1 часть логов в тасках, 2-ая в очереди),
                // надо подумать можно ли так много доставать из очереди
                while (true)
                {
                    // получим пачку логов для отправки
                    var batchLogs = LogQueue.GetBatchMessages(batchSize);
                    if (batchLogs.Count == 0)
                    {
                        Order = 0;
                        return;
                    }

                    // установим серверное время
                    foreach (var log in batchLogs)
                    {
                        if (log.Date == null)
                        {
                            log.Date = Client.ToServerTime(log.CreateDate);
                        }
                    }

                    // отправим
                    TaskQueue.Add(SendBatchLogs, batchLogs, "SendBatchLogs");
                }
            }
        }
示例#2
0
 public long GetQueueSize()
 {
     return(LogQueue.Bytes());
 }