/// <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); }
//Методы private void Raise_DS_Changed(DataSourceEvent e) { if (DS_Changed != null) { DS_Changed(e); } }
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; }
//Методы /// <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"); }
/// <summary> /// Получает первое событие из очереди. /// </summary> /// <returns></returns> public DataSourceEvent GetNextEvent() { if (_eventQueue.Count == 0) { return(null); } DataSourceEvent e = _eventQueue.PopFirst();//выталкивает первый элемент из очереди return(e); }
//Методы /// <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); }
//Методы 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); }
/// <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("."); } }
//методы /// <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); }
public void RemoveDataSourceEvent(DataSourceEvent dse) { ((List <int>)elementList.Value).Remove((int)dse.Id); elementList.Changed = true; }