Здравствуйте. Хочу поделиться с вами знаниями добытыми кровью и слезами. Рожденные страданиями и отполированные отчаянием, пусть их блеск сияет в вашем сознании так же ярко, как мои седые волосы после всех испытаний. Вся мудрость монахов Тибета меркнет перед светом озарения, который вы постигнете.
OnAppEnd из AppEventListenerBase на Windows 7.17.4 работает, а на Net.Core 7.17.4 НЕ РАБОТАЕТ (или там нету UserConnection, что в принципе не позволит вам сделать какую-либо операцию на уровне приложения). Вы никаким образом не сможете дать выполняющимся потокам информацию о том что приложение хочет остановиться. И пока ваши потоки выполняются - рестарта не произойдет! Если у вас длинная операция или рекурсивная логика (как было в моем случае) - вы будете ждать вечность пока что-то не остановит ваш(и) поток(и). Вы думаете вы хитрее и разнесете выполнение логики в отдельные треды? А вот и нет: приложение просто рухнет на рестарте! Видимо это связано с тем, что в контейнере оказывается две работающие сборки. Решение кстати в таком случае - перезапуск контейнера. Но мы же не можем при каждой поставке перезапускать контейнеры у заказчика, верно?
Так что же делать, спросите вы? Как нам быть, Егор? Что делать, если OnAppEnd не работает?
С этим вопросом я странствовал по миру и много думал. За время поисков я разгадал загадки Атлантиды, Бермудского треугольника, убийство Кеннеди и Тунгусского метеорита, но загадка рестарта приложения Creatio 7.17.4 на Net.Core не поддавалась решению. Приложение то не перезапускалось, то падало при рестарте. Долго ходил я в поисках ответа, пока случайно не заметил, что при рестарте приложения Quartz перестает запускать ежеминутные триггеры.
Во время попытки рестарта приложения планировщик заданий переходит в режим паузы (StandBy), определить это легко через класс AppScheduler: AppScheduler.Instance.InStandbyMode. Если true, то планировщик остановлен - это значит, что приложение пытается перезапуститься. Планировщик может останавливаться и по другим причинам, но эта - одна из них, которая может быть спасительной соломинкой в таких ситуациях.
Вы можете вставить проверку в логику вашего потока на AppScheduler.Instance.InStandbyMode == true и завершать его в этом случае. После завершения всех потоков приложение перезапустится.
Спасибо за внимание!
Кстати, на неткоре также есть особенность: запускаемые через FlowEngine процессы из EntityEventListener в фоновом режиме не будут идти по элементам (видимо также нету UserConnection). Приходится запускать их не в фоновом режиме.