Публикация

OnAppEnd не отрабатывает (.NET Core, 7.17.4)

Здравствуйте. Хочу поделиться с вами знаниями добытыми кровью и слезами. Рожденные страданиями и отполированные отчаянием, пусть их блеск сияет в вашем сознании так же ярко, как мои седые волосы после всех испытаний. Вся мудрость монахов Тибета меркнет перед светом озарения, который вы постигнете.



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 и завершать его в этом случае. После завершения всех потоков приложение перезапустится.



Спасибо за внимание!

Нравится

Поделиться

1 комментарий

Кстати, на неткоре также есть особенность: запускаемые через FlowEngine процессы из EntityEventListener в фоновом режиме не будут идти по элементам (видимо также нету UserConnection). Приходится запускать их не в фоновом режиме.

Показать все комментарии