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"); } } }
public long GetQueueSize() { return(LogQueue.Bytes()); }