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



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). Приходится запускать их не в фоновом режиме.

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

Коллеги всем доброго времени суток!

Кто нибудь пробовал уже разрабатывать на системе ориентированной под linux?

Как там происходит разработка в ФС и отладка серверного кода, как подсоединятся к процессу и т.д., в общем весь тот процесс, что делаем на Windows?

Благодарю!

Нравится

4 комментария

Насколько понимаю, в версии на .NET Core, которая используется под Linux, сейчас возможности разработки ограничены. Там даже нет раздела «Конфигурация»:

Большинство инструментов разработки и кастомизации уже поддерживают работу на платформе .NET Core. Реализована поддержка Low-code инструментов: дизайнера процессов, мастера раздела, мастера деталей и мастера мобильного приложения.

Также поддерживают работу на платформе утилиты командной строки, которые помогают разрабатывать и автоматизировать процессы разработки: WorkspaceConsole, clio.

В процессе разработки поддержка раздела [Конфигурация]. Планируется также поддержка дизайнера объектов. Сейчас разработка этими инструментами может происходить на Windows, изменения, сделанные этими инструментами, переносятся пакетами на Linux.

Добрый день! Хотелось бы вернутся к вопросу отладки серверного кода под Linux. Спасибо!

Дмитрий Каплин,

В данном случае есть возможность провести отладку удалённо с Windows-машины. Рекомендуем использовать инструкцию ниже.

 

У вас на Linux развернут некий продукт (например по пути: '/home/user/creatioApps/Product'). В дальнейшем мы будем использовать пути, указанные для примера, у вас же будут свои пути.

 

Нужно:

1. На Linux по пути /home/user/creatioApps/Product/WorkspaceConsole/Terrasoft.Tools.WorkspaceConsole.dll.config

настраиваете конфигурационный файл, а именно соединение к базе данных, в секции <connectionStrings>.

Настройки соединения с базой данных можно скопировать с конфигурационого файла по пути /home/user/creatioApps/Product/ConnectionStrings.config

2. Для логов WorkspaceConsole на Linux создаете папку /home/user/creatioApps/Logs

3. На Linux переходите в папку /home/user/creatioApps/Product/WorkspaceConsole и запускаете следующую команду:

dotnet Terrasoft.Tools.WorkspaceConsole.dll -operation=UpdateWorkspaceSolution -workspaceName=Default -webApplicationPath="/home/user/creatioApps/Product" -confRuntimeParentDirectory="/home/user/creatioApps/Product" -logPath="/home/user/creatioApps/Logs" -autoExit=true

У Вас будут другие пути.

4. Файлы того же же продукта для Linux, который развернут на Linux, разместить на Windows (например, по пути: 'C:\Product').

Можно распаковать туда файлы из архива продукта для Linux.

5. Скопировать все файлы с Linux по пути /home/user/creatioApps/Product/Terrasoft.Configuration/Autogenerated/Src

на Windows машину по пути C:\Product\Terrasoft.Configuration\Autogenerated\Src

6. На Linux по пути /home/user/creatioApps/Product/Terrasoft.WebHost.dll.config

настраиваете конфигурационный файл, а именно меняете или добавлятете в секции  <appSettings> следующую насройку:

<add key="LoadAssemblyFromByteArray" value="false" />

Таким образом включается отладка для конфигурационной сборки.

ВНИМАНИЕ: чтобы отладка работала, среда .Net загружает сборку по прямой ссылке, однако она тогда же и блокирует перезапись этой сборки,

а перезапись сборки происходит во время компиляции и установки пакетов.

Поэтому ОТКЛЮЧАЙТЕ ОТЛАДКУ НА ПРОДУКТОВОЙ СРЕДЕ и ПЕРЕД КОМПИЛЯЦИЕЙ или УСТАНОВКОЙ ПАКЕТОВ

7. Перезапустите приложение на Linux

8. На Windows открываете проект по пути "C:\Product\Terrasoft.Configuration\Terrasoft.Configuration.Dev.csproj"

9. Подсоединяетесь к процессу на Linux, по инструкции "Удаленная отладка .NetCore приложений в Linux под Windows.pdf", которая находится во вложении.

10. Находите необходимый Вам файл в C:\Product\Terrasoft.Configuration\Autogenerated\Src и устанавливаете точку остановки.

 

Среда разработки может отображать точку остановки, как недоступную для отладки, но пусть это Вас не смущает, она отработает когда поток выполнения попадет в эту точку.



Так же необходимо подключить vsdbg, для того чтобы MSVS могла подключиться к .net процессу. 

Install vsdbg to remote host (following script install to ~/vsdbg)

curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l ~/vsdbg



Тут есть два варианта, это пересобрать docker image, включив в него вышеописанную строку.  Или каждый раз после перезапуска докера, выполнять команду:

docker exec -it curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l ~/vsdbg



Интонируя данный прокси MSVS для отладки.  Также можно воспользоваться Rider, он сам ставит нужный модуль, для отладки при первом подключении.

Добавить комментарий

Павел,

Можете ознакомиться с ответом выше.

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

Добрый день!

 

В релизах есть версия studio на neetcore для linux систем. А существует какой-нибудь guide по установке/настройке? Очень интересно было бы попробовать

Нравится

2 комментария

Премного благодарен

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