/// <summary> /// The execute impl. /// </summary> /// <param name="context"> /// The context. /// </param> protected override void ExecuteImpl(IJobExecutionContext context) { lock (LockObject) { try { // Останавливаем все триггеры context.Scheduler.PauseAll(); // Ждем окончания всех работ var waitInterupt = false; while (!waitInterupt) { Thread.Sleep(1000); var executingJobs = context.Scheduler.GetCurrentlyExecutingJobs(); if (executingJobs.Count == 1 && executingJobs.First().JobInstance == this) { waitInterupt = true; } } // Вырубаем сайт SiteMode.SetOfflineMode(CalculateOnlineDateTime()); // Сохраянем время начала синхронизации SaveSyncStartOrFinishTime("_Start"); var atlServices = ObjectFactory.GetInstance <IAtlService>(); if (ConfigManager.SynchronizationSettings.SynchronizationNsi) { atlServices.RunSinhronizeNsi(context); } if (ConfigManager.SynchronizationSettings.SynchronizationToPvp) { atlServices.RunExportToPvp(context); } // Сохраянем время окончания синхронизации SaveSyncStartOrFinishTime("_Finish"); } finally { // Запускаем снова все триггеры context.Scheduler.ResumeAll(); // Переводим сайт в online SiteMode.SetOnlineMode(); } } }
/// <summary> /// The execute impl. /// </summary> /// <param name="context"> /// The context. /// </param> protected override void ExecuteImpl(IJobExecutionContext context) { // 4. Если бэкап холодный, нужно (отключить всех пользователей). // 4.1 Переводим ПО в офлайн режим по конфигу (таким образом отключаем создание новых задач и всех пользователей онлайна) // 4.2 Ждем окончания уже запущенных задач кварца // 4.3 Создаем бэкап lock (LockObject) { // Ставим тригер на паузу, чтобы не плодить потоков, которые выпадут в ожидание по lock context.Scheduler.PauseTrigger(context.Trigger.Key); try { if (ConfigManager.ExchangeSettings.DisconnectUsers) { // 4.1 Переводим ПО в офлайн режим по конфигу (таким образом отключаем создание новых задач и всех пользователей онлайна) SiteMode.SetOfflineMode(context.JobRunTime.Add(new TimeSpan(0, 5, 0, 0)).ToString()); context.JobDetail.JobDataMap["progress"] = 20; // 4.2 Ждем окончания уже запущенных задач кварца кроме той которая выполняет бэкап базы var schedulerFactory = ObjectFactory.GetInstance <ISchedulerFactory>(); var scheduler = schedulerFactory.GetScheduler(); // Останавливаем шедуллер (старт новых задач) scheduler.PauseAll(); while (true) { // если осталась одна работа, то это выполнение бэкапа if (scheduler.GetCurrentlyExecutingJobs().Count == 1) { break; } Thread.Sleep(5000); } context.JobDetail.JobDataMap["progress"] = 40; } // 4.3 Создаем бэкап var session = ObjectFactory.GetInstance <ISessionFactory>().GetCurrentSession(); var currentDataBase = session.GetSessionImplementation().Connection.Database; var dialect = session.GetSessionImplementation().Factory.Dialect; if (dialect is Oracle8iDialect) { var filePath = Path.Combine( ConfigManager.ExchangeSettings.BackupOutputFolder, string.Format( "{0}.{1}.dmp", currentDataBase, DateTime.UtcNow.ToString("yyyy.MM.dd HH.mm"))); // TODO: get from config var userName = string.Empty; var password = string.Empty; var listener = string.Empty; var backupQuery = session.CreateSQLQuery( string.Format( @"exp {0}/{1}@{2} file={3} consistent=y", userName, password, listener, filePath)); backupQuery.UniqueResult(); } else if (dialect is MsSql2000Dialect) { var filePath = Path.Combine( ConfigManager.ExchangeSettings.BackupOutputFolder, string.Format( "{0}.{1}.bak", currentDataBase, DateTime.UtcNow.ToString("yyyy.MM.dd HH.mm"))); var sql = @"BACKUP DATABASE {0} TO DISK = '{1}' WITH FORMAT, MEDIANAME = 'Z_SQLServerBackups', NAME = 'Full Backup of {2}';"; var backupQuery = session.CreateSQLQuery(string.Format(sql, currentDataBase, filePath, currentDataBase)); backupQuery.UniqueResult(); } context.JobDetail.JobDataMap["progress"] = 100; logger.Info("Процесс создания бэкапа успешно завершён"); } catch (Exception exception) { logger.Fatal("В процессе создания бэкапа произошла ошибка", exception); } finally { context.Scheduler.ResumeTrigger(context.Trigger.Key); // Выводим сайт из состояния офлайна if (ConfigManager.ExchangeSettings.DisconnectUsers) { SiteMode.SetOnlineMode(); var schedulerFactory = ObjectFactory.GetInstance <ISchedulerFactory>(); var scheduler = schedulerFactory.GetScheduler(); scheduler.ResumeAll(); } } } }