private void InitUpdateManager() { Logger.WriteToTrace($"Включение слежения за обновлениями в директории \"{Context.Settings.Registry.UpdatesPath}\"..."); UpdateManager = new ETLUpdateManager(Pumps, Context.Settings.Registry); Logger.WriteToTrace("Проверка наличия обновлений."); UpdateManager.CheckUpdates(); UpdateManager.OnReceiveUpdate += async(s, a) => { await Broadcast.Send(new ETLBroadcastAction { Action = "receiveUpdate", Data = a.UpdateInfo }); }; UpdateManager.OnUpdate += async(s, a) => { // Обновлённая закачка ETLProcess prc = Pumps.FirstOrDefault(p => p.ProgramID == a.UpdateInfo.ProgramID); if (prc == null) { return; } await Broadcast.Send(new ETLBroadcastAction { Action = "update", Data = new Dictionary <string, object> { { "Info", a.UpdateInfo }, { "Config", prc.ConfigData } } }); }; }
/// <summary> /// Функция запуска закачки /// </summary> public decimal Execute(string id, string config) { ETLProcess prc = Pumps.FirstOrDefault(p => p.ProgramID == id); // Проверка наличия в реестре if (prc == null) { throw new Exception("Закачка с заданным идентификатором отсутствует."); } // Проверка среди запущенных if (prc.IsExecuting) { return(-1); } // Для запуска процесса версия БД должна быть выше if (prc.Version > Context.Version) { throw new Exception("Версия системы ниже необходимой для запуска."); } decimal sessNo = Context.History.AddRecord(prc.ProgramID, Context.Version, prc.Version, "user", config); // При запуске добавляем в список запущенных prc.OnStart += async(s, a) => { await Broadcast.Send(new ETLBroadcastAction { Action = "startPump", Data = new Dictionary <string, object> { { "id", id } } }); }; // При закрытии процесса удаляем его из запущенных prc.OnExit += async(s, a) => { await Broadcast.Send(new ETLBroadcastAction { Action = "endPump", Data = new Dictionary <string, object> { { "id", id }, { "status", ((ETLProcess)s).LastStatus.ToString() } } }); }; prc.Start(sessNo); return(sessNo); }
public int ApplyUpdates(string[] updates) { int count = UpdateManager.Updates.Count; foreach (ETLUpdateRecord rec in updates.Select(u => UpdateManager.Updates[u])) { // Обновление невозможно применить при запущенном процессе закачки ETLProcess prc = Pumps.FirstOrDefault(p => p.ProgramID == rec.ProgramID); if (prc != null && prc.IsExecuting) { continue; } UpdateManager.ApplyUpdate(rec, Context.History); } return(count - UpdateManager.Updates.Count); }
/// <summary> /// Инициализация списка закачек /// </summary> private void InitPumpsList() { Logger.WriteToTrace("Формирование списка закачек."); Pumps = new List <ETLProcess>(); string[] pumpConfigs = Directory.GetFiles(Context.Settings.Registry.ProgramsPath); List <string> ids = new List <string>(); foreach (string pumpConfig in pumpConfigs) { try { string fileName = Path.GetFileName(pumpConfig); JObject data = JsonCommon.Load(pumpConfig); string id = data["id"].ToString(); // Если уже существует закачка с таким ID if (ids.Contains(id)) { Logger.WriteToTrace($"Закачка с ID = \"{id}\" (\"{fileName}\") уже существует.", TraceMessageKind.Warning); continue; } // Процесс инициализируется данными конфигурации ETLProcess prc = new ETLProcess(pumpConfig, Context.History); // Сохраняется конфиг закачки с описанием Pumps.Add(prc); ids.Add(id); } catch (Exception ex) { Logger.WriteToTrace($"Ошибка при формировании реестра закачек: {ex}.", TraceMessageKind.Error); } } }
/// <summary> /// Аварийное завершение закачки /// </summary> public void Terminate(string id) { ETLProcess pump = Pumps.FirstOrDefault(p => p.IsExecuting && p.ProgramID == id); pump?.Terminate(); }