示例#1
0
        /// <summary>
        /// Запускает проверку источника данных в отдельном потоке.
        /// </summary>
        /// <param name="dataSource">Проверяемый источник данных</param>
        public void CheckDataSource(MetaObjectApp.DataSource dataSource)
        {
            //Делаем асинхронный делегат, который запускает проверку источника
            IDatasourceMonitor dsm = monitorList.Find((e) => { return(e.DataSourceName == dataSource.DataSourceName); });

            if (dsm == null)
            {
                return;
            }

            AcyncDelegate d = new AcyncDelegate(() => {
                string newControlSum = dsm.controlSum();
                if (newControlSum != dataSource.ControlSum) //контрольная сумма изменилась
                {
                    //сохраняем новую контрольную сумму
                    dataSource.ControlSum = newControlSum;
                    _repository.Save(dataSource);

                    //создаем новый метаобъект "событие"
                    DataSourceEvent newEvent = (DataSourceEvent)_repository.CreateNewMetaObject(MetaObjectType.DataSourceEvent, "");
                    newEvent.EventType       = "DSchanged";
                    newEvent.SetDataSource(dataSource);
                    _repository.Save(newEvent);

                    //добавляем этот метаобъект в метаобъект "события"
                    DataSourceEvents events = _repository.LoadMetaObject("DataSourceEvents") as DataSourceEvents;
                    events.AddDataSourceEvent(newEvent);
                    _repository.Save(events);

                    Raise_DS_Changed(newEvent);
                }
            });

            d.BeginInvoke(null, null);
        }
示例#2
0
 //Методы
 private void Raise_DS_Changed(DataSourceEvent e)
 {
     if (DS_Changed != null)
     {
         DS_Changed(e);
     }
 }
示例#3
0
 public void AddDataSourceEvent(DataSourceEvent dse)
 {
     if (elementList.Value == null)
     {
         elementList.Value = new List <int>();
     }
     ((List <int>)elementList.Value).Add((int)dse.Id);
     elementList.Changed = true;
 }
示例#4
0
        //Методы
        /// <summary>
        /// Обработка события.
        /// </summary>
        /// <param name="e"></param>
        public void ProcessEvent(DataSourceEvent e)
        {
            Dictionary <string, string> pathToETLAndArgs = _eventDecryptor.DecryptEvent(e);
            ProcessStartInfo            info             = new ProcessStartInfo(pathToETLAndArgs["path"], pathToETLAndArgs["args"]);

            info.UseShellExecute = true;
            Process p = Process.Start(info);

            Console.WriteLine("Запускаем сборку ETL");
        }
示例#5
0
        /// <summary>
        /// Получает первое событие из очереди.
        /// </summary>
        /// <returns></returns>
        public DataSourceEvent GetNextEvent()
        {
            if (_eventQueue.Count == 0)
            {
                return(null);
            }

            DataSourceEvent e = _eventQueue.PopFirst();//выталкивает первый элемент из очереди

            return(e);
        }
示例#6
0
        //Методы
        /// <summary>
        /// Метод для расшифровки сообщения.
        /// </summary>
        /// <param name="e"></param>
        /// <returns></returns>
        public Dictionary <string, string> DecryptEvent(DataSourceEvent e)
        {
            //получить событие, узнать про датасорс и етл
            DataSource ds  = e.GetDataSource();
            ETL        etl = ds.GetETL();

            Dictionary <string, string> result = new Dictionary <string, string>();

            result["path"] = etl.AssemblyPath;
            result["args"] = etl.AssemblyArgs;
            return(result);
        }
示例#7
0
        //Методы
        public List <DataSourceEvent> GetDataSourceEvents()
        {
            List <int>             list             = elementList.Value as List <int>;
            List <DataSourceEvent> dataSourceEvents = new List <DataSourceEvent>();

            foreach (int inx in list)
            {
                DataSourceEvent remo = _repository.LoadMetaObject(inx) as DataSourceEvent;
                dataSourceEvents.Add(remo);
            }
            return(dataSourceEvents);
        }
示例#8
0
        /// <summary>
        /// Метод, выполняющийся в отдельном потоке. Это главный управляющий поток работы менеджера ETL.
        /// </summary>
        void ThreadLoop()
        {
            while (_isRunning)
            {
                List <DataSourceEvent> events = _reglamentManager.ReadReglament();
                if (events.Count > 0)
                {//добавляем в очередь событий
                    _eventManager.AddEvents(events);
                }

                //Получение из очереди очередного события
                DataSourceEvent e = _eventManager.GetNextEvent();
                if (e != null)
                {
                    _etlExecuteManager.ProcessEvent(e);
                    Console.WriteLine("Длина очереди {0}", _eventManager.EventCount());
                    Console.WriteLine("Текущее время: {0}", DateTime.Now);
                }
                Thread.Sleep(1000);
                Console.Write(".");
            }
        }
示例#9
0
        //методы
        /// <summary>
        /// Генерирует события по регламенту
        /// </summary>
        /// <param name="reglamentElements"></param>
        /// <returns></returns>
        public List <DataSourceEvent> GenerateEvents(List <ReglamentElementMetaObject> reglamentElements)
        {
            List <DataSourceEvent> events = new List <DataSourceEvent>();

            DataSourceEvents dses = _repository.LoadMetaObject("DataSourceEvents") as DataSourceEvents;

            foreach (ReglamentElementMetaObject remo in reglamentElements)
            {
                DataSourceEvent dse = _repository.CreateNewMetaObject(MetaObjectType.DataSourceEvent, "") as DataSourceEvent;
                dse.SetDataSource(remo.getDataSource());
                if (remo.ReglamentElementType == "ExecETL")
                {
                    dse.EventType = "ExecETL_Timer";
                }
                else if (remo.ReglamentElementType == "CheckDS")
                {
                    dse.EventType = "CheckDS_Timer";
                }
                else
                {
                    throw new Exception("Неизвестный тип элемента регламента");
                }

                _repository.Save(dse);
                dses.AddDataSourceEvent(dse);
                events.Add(dse);

                //генерация новых элементов регламента в связи с периодичностью
                if (remo.Period.TotalSeconds > 0.1)
                {
                    remo.LastRunTime  = remo.NextRunTime;
                    remo.NextRunTime += remo.Period;
                    _repository.Save(remo);
                }
            }
            _repository.Save(dses);
            return(events);
        }
示例#10
0
 public void RemoveDataSourceEvent(DataSourceEvent dse)
 {
     ((List <int>)elementList.Value).Remove((int)dse.Id);
     elementList.Changed = true;
 }