Показать сообщение отдельно
Старый 31.01.2019, 11:29   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Как правильно? куда вставить действия при старте AOS? ax2009, ax2012 и прочие версии
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, но до запуска остальных сессий?
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 31.01.2019 в 11:51.
За это сообщение автора поблагодарили: alex55 (1).