예제 #1
0
 public DataExporter(IAction action, RetroKadr kadr, List <ParamData> archives, List <QueryConditionsDates> conditionsDate)
 {
     Action         = action;
     Kadr           = kadr;
     Archives       = archives;
     ConditionsDate = conditionsDate;
 }
예제 #2
0
        /// <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);
        }
예제 #3
0
        /// <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);
                }
            }
        }