Ejemplo n.º 1
0
        /// <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();
                }
            }
        }
Ejemplo n.º 2
0
        /// <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();
                    }
                }
            }
        }