public DataExporter(IAction action, RetroKadr kadr, List <ParamData> archives, List <QueryConditionsDates> conditionsDate) { Action = action; Kadr = kadr; Archives = archives; ConditionsDate = conditionsDate; }
/// <summary> /// Получить архивные данные кадра /// </summary> /// <param name="dateStart"></param> /// <param name="dateFinish"></param> /// <param name="kadr"></param> /// <param name="dataRegistry"></param> /// <returns></returns> private List <ParamData> GetDataArc(DateTime dateStart, DateTime dateFinish, RetroKadr kadr, DataRegistry dataRegistry) { var result = new List <ParamData>(); lock (dataRegistry.Locker) { using (dataRegistry.ConnHolder) { foreach (IArchive arc in kadr.Parameters) { result.Add(new ParamData( MeasureHelper.GetByTablePeriod(dataRegistry, arc.Retfname, new RsduTime(dateStart), new RsduTime(dateFinish)), arc)); } } } return(result); }
/// <summary> /// В очереди появилась задача - выполняем. /// Метод всегда запускается в отдельном потоке (new Thread(ReceiveRetroProcess)) - не изменять это! /// </summary> private void ReceiveRetroProcess() { QueueObjectAction objectAction = null; try { if (_queueAction == null || _queueAction.IsEmptyQueue()) { return; } #if DEBUG Log.Info("По таймеру разбираем очередь "); #endif objectAction = _queueAction.GetFirst(); // Обрабатываем только новые действия if (objectAction == null || _listActionsRunning.ContainsKey(objectAction.Guid)) { return; } if (!IsReceivedObject(objectAction)) { Log.Info("Выполнение действия прервано " + objectAction.Action.GuidAction); return; } _listActionsRunning[objectAction.Guid] = 0; DateTime dtNow = DateTime.Now; // Отложим время выполнения действия если задана соответствующая настройка if (objectAction.Action.RunTimeOffset > 0) { Log.Info("Выполнение действия отложено " + objectAction.Action.GuidAction); Thread.Sleep(TimeSpan.FromSeconds(objectAction.Action.RunTimeOffset)); Log.Info("Выполнение действия возобновлено " + objectAction.Action.GuidAction); } var dataRegistry = Registry.GetNewRegistry(_rsduDbConf.DSN, _rsduDbConf.Login, _rsduDbConf.Password); dataRegistry.SetAppName(_rsduDbConf.AppName); lock (dataRegistry.Locker) { Log.Info("Количество задач в очереди до обработки " + _queueAction.Count()); _timerThread.Start(); var archives = new List <ParamData>(); // Получение кадра из бд RetroKadr kadr = GetKadr(objectAction.Action.KadrId, dataRegistry); if (kadr == null) { _timerThread.Stop(); RemoveActionRunning(objectAction); return; } var conditionsDates = new List <QueryConditionsDates>(); // Расчет периода и запрос архивов Dictionary <DateTime, DateTime> startFinish = new Dictionary <DateTime, DateTime>(); foreach (var queryCondition in objectAction.Action.QueryConditions) { DateTime start = GetDateStart(queryCondition, dtNow); DateTime finish = GetDateFinish(queryCondition.Interval, queryCondition.IntervalCount, start); conditionsDates.Add(new QueryConditionsDates(queryCondition, start, finish)); List <ParamData> archive = GetDataArc(start, finish, kadr, dataRegistry); if (archive != null) { archives.AddRange(archive); } startFinish.Add(start, finish); } IDataExporter dataExporter = new DataExporter(objectAction.Action, kadr, archives, conditionsDates); Log.Info("Выполняется задача " + objectAction.Guid); bool exported = dataExporter.Export(startFinish, dtNow); Log.Info("Выполнена задача " + objectAction.Guid + " - " + exported); if (exported) { _queueAction.DeleteRecord(objectAction); } else { _queueAction.DeleteRecord(objectAction); objectAction.CountError = objectAction.CountError + 1; _queueAction.EnqueueObject(objectAction); } _evGetRetro.Set(); _timerThread.Stop(); RemoveActionRunning(objectAction); #if DEBUG Log.Info("Количество задач в очереди после обработки " + _queueAction.Count()); #endif } dataRegistry = null; } catch (ThreadAbortException) { // При остановке сервиса все потоки грохаются с помощью Thread.Abort. // Предотвращаем появление исключения "Поток находился в процессе ожидания" из-за того, // что некоторые потоки находятся в приостановленном состоянии т.к. мы Thread.Sleep делаем Thread.ResetAbort(); } catch (Exception ex) { Log.Error("Не удалось выполнить задачу из очереди", ex); if (objectAction != null) { RemoveActionRunning(objectAction); } } }