Disclaimer:
Обратите внимание, вопрос сформулирован "Как правильно?"
На проекте задача уже решена. Поэтому, пожалуйста, не уводите тему в сторону "быстрых и грязных решений".
Задача:
= Обновить параметры интеграции с 1С
= Обновить url в references внешних вебсервисов
= Обновить параметры после рестора рабочей базы в текстовую
или другие подобные действия, которые надо выполнить один раз после останова всех кластерных АОСов, но до старта обычных сессий.
Вопросы:
Куда лучше вставить вызов таких действий?
Какими условиями стоит обставить вызов?
Какие условия стоит учесть при вызове таких действий?
См. также:
ClientType::Server
Является ли текущее приложение рабочим или тестовым
Что получилось исследовать на ax2009:
- Application.startup() не вызывается при старте AOS. только workTread, Client и, возможно, бизнес-коннектор
- Application.new() вызывается и при старте AOS (isServer() == true в этот момент).
- Но в этот момент еще не определены глобальные переменные appl, infolog, classFactory. Соответственно, не работают транзакции, нет глобальных кэшей, не работают infolog-сообщения (что запрещает использование огромной кучи стандартного функционала).
- А самое главное, в этот момент еще не заполнены таблицы SysClientSessions, SysServerSessions, SysClientServerSessions, а методы класса Session возвращают левую дичь. например, xSession.serverId возвращает идентификатор, которого нет в SysServerConfig.
получается, что в Application.new() вставится можно. Но в этом месте аксапта еще не инициализирована, поэтому в этом месте слишком много ограничений.
Альтернативный вариант:
предположим, мы решили использовать lazy-инициализацию
и дожидаемся пока кто-то запустит неинициализированный функционал,
и в момент запуска проверяем была ли выполнена инициализация
и инициализируем если нужно.
но инициализация может выполняться достаточно долго (несколько секунд при старте АОС роли не играет, а несколько секунд ожидания при работе клиентов - критично)
поэтому с lazy-инициализацией с огромной вероятностью получим гонку за ресурсом.
следовательно надо будет устраивать какой-то мьютекс и решать прочие параллельные проблемы.
Но вдруг кто-то и так решал?
Плюсы-минусы?
В общем,
Куда вставить свой код инициализации/обновления так, чтобы он сработал после инициализации AOS, но до запуска остальных сессий?