AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.05.2017, 12:21   #1  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
Принудительное завершение сессии
Добрый день! Мне необходимо принудительно завершать "лишние" сессии пользователя, при запуске пользователем аксапты. Алгоритм таков, что при запуске аксапты выполняется xSession.terminate. Но к сожалению столкнулся с тем что это действует только при условии что у него есть секретный ключ SysDevelopment. Как обойти это условие, или же завершить сессию другим более экзотическим способом?
Спасибо.
Старый 02.05.2017, 12:44   #3  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
ну да, согласен, это прокатит если пользователь запустил только одно приложение аксапты. а если, например, 2 или более. и нужно старые сессии отрубить. Т.е. мне надо не текущий клиент убивать а старые сессии закрывать

Последний раз редактировалось CHESER85; 02.05.2017 в 12:55.
Старый 03.05.2017, 09:15   #4  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Как насчет контроля за количеством сессий? Т.е. не открывать новые сессии, если не закрыты старые?
В АХ4 этого можно добиться, прописав следующий код в начале метода AppComponent.handleStartupEvent()
X++:
#define.SessionsAllowed(3)

SysClientSessions   clientSessions;
;

select count(RecId) from clientSessions
    where clientSessions.UserId     == curuserid()
       && clientSessions.Status     == 1
       && clientSessions.ClientType == 0;

if (clientSessions.RecId > #SessionsAllowed)
{
    box::stop(strfmt("%1 is only allwed %2 AX Client Sessions.  AX Client will close now.",
        xUserInfo::find().name, #SessionsAllowed), "AX Client Sessions exceeded");

    appl.globalCache().set(classstr(Info),identifierstr(Autologoff), true);
    info = new Info();
    info.shutDown(true);
}
Мы даже сделали таблицу с 2 полями: UserId, AllowedSessions.
Разработчикам и консам дали 5 сессий, а остальным по 3. Все довольны.
__________________
// no comments
За это сообщение автора поблагодарили: bitter (1).
Старый 03.05.2017, 10:52   #5  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,322 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от CHESER85 Посмотреть сообщение
Добрый день! Мне необходимо принудительно завершать "лишние" сессии пользователя
А Вы можете определить критерий "лишних" сессий? Если да, то почему бы не вызывать тот же метод xSession.terminate от имени какого-нибудь "пакетного" пользователя, т.е. технического пользователя, имеющего все права и от имени которого можно запустить регулярное пакетное задание? И не завязываться на событие "Вход в систему"?

(Сам не пробовал, просто идея в голову пришла. Может этот вариант и не будет работать).
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: CHESER85 (1), Perc (1).
Старый 03.05.2017, 11:32   #6  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
да, это похоже на сегодняшний день единственный вариант, чтобы пакетник с правами админа завершал старые сессии остальных пользователей
Старый 03.05.2017, 11:33   #7  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
Цитата:
Сообщение от dech Посмотреть сообщение
Как насчет контроля за количеством сессий? Т.е. не открывать новые сессии, если не закрыты старые?
В АХ4 этого можно добиться, прописав следующий код в начале метода AppComponent.handleStartupEvent()
X++:
#define.SessionsAllowed(3)

SysClientSessions   clientSessions;
;

select count(RecId) from clientSessions
    where clientSessions.UserId     == curuserid()
       && clientSessions.Status     == 1
       && clientSessions.ClientType == 0;

if (clientSessions.RecId > #SessionsAllowed)
{
    box::stop(strfmt("%1 is only allwed %2 AX Client Sessions.  AX Client will close now.",
        xUserInfo::find().name, #SessionsAllowed), "AX Client Sessions exceeded");

    appl.globalCache().set(classstr(Info),identifierstr(Autologoff), true);
    info = new Info();
    info.shutDown(true);
}
Мы даже сделали таблицу с 2 полями: UserId, AllowedSessions.
Разработчикам и консам дали 5 сессий, а остальным по 3. Все довольны.
А если например зависла аксапта и ее аварийно пришлось закрыть? а сессия висеть осталась
Старый 03.05.2017, 11:46   #8  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от CHESER85 Посмотреть сообщение
А если например зависла аксапта и ее аварийно пришлось закрыть? а сессия висеть осталась
В этом случае велик шанс того, что либо Вы в принципе не сможете программно снять сессию, либо сессию в Axapta снимете, но останется висеть сеанс в SQL. В любом случае, позовут админа (или программиста)

Кроме того, опять же, необходимо разобраться в причинах зависания. Зависло по "внешним", не зависящим от кода Axapta, причинам или же кривой код написали?

Т.е., в общем случае, стратегия автоматического закрытия сессий Axapta - это тупиковый путь. Вам по любому придется "пальцем придерживать" этот функционала. Т.е. "вручную" снимать зависшие сессии. Не все, конечно, но это будет достаточно часто. Либо Вы будете постоянно получать не корректную работу функционала, если, например, код Axapta привел к зацикливанию, а сессию Вы прибили.

Поэтому предложение по контролю количества уже открытых сессий одного пользователя лично мне представляется как более разумное решение, по сравнению с автоматическим снятием сессий.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 03.05.2017, 14:01   #9  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,322 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от CHESER85 Посмотреть сообщение
А если например зависла аксапта и ее аварийно пришлось закрыть? а сессия висеть осталась
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
либо сессию в Axapta снимете, но останется висеть сеанс в SQL.
Тут надо понимать, что снимать сессии в АХ нужно вкупе со снятием сеансов в SQL. Сеанс в SQL висеть сам по себе конечно не будет - он выполнит свою работу и завершится. Но не всегда снятие сеанса в АХ спасет ситуацию.
Пример 1.
Пользователь открыл АХ и ушел домой. На следующий день он не задумываясь - снова запустил АХ (вторую сессию) и сидит в ней работает. В этом случае прибитие первой сессии средствами АХ вполне допустимо, правильно и быстро. Цель - уменьшение количества лишних пользователей, одновременно зашедших в систему (лицензионные ограничения). Есть еще параметр автозавершение, но он не всегда может сработать (он не сработает, если Аксапте для закрытия формы нужно выдать запрос пользователю - типа Сохранить? Да/Нет)

Пример 2. Пользователь открыл АХ, запустил долгостороящийся отчет / долгую периодическую операцию. При этом тормоза связаны с алгоритмом, написанном на Х++ (не с БД и не с огромной транзакцией). Пользователь запускает вторую сессию АХ, на первую плюет, а админам (из-за лицензионных ограничений) эту зависшую сессию надо удалить. В этом случае прибитие первой сессии средствами АХ вполне допустимо, правильно и быстро. Но тут нужно точно знать, что проблема не в БД, а обычно, если уж точно знают, что проблема не в БД, то уж исправляют алгоритм.

Пример 3.
Пользователь открыл АХ, запустил долгостороящийся отчет / долгую периодическую операцию / открыл тяжелую форму. При этом тормоза связаны с БД. Возможно, что идет смешение с предыдущим примером - мелкие запросы выполняются 100500 раз и с т.з. пользователя - все виснет. И пользователь решает тоже снять задачу. В этом случае:
- если есть очень большая транзакция, то по-любому пойдет ее откат (а это тоже время)
- если запустилась большая хранимая процедура (или просто тяжелый запрос, в т.ч. неиндексированный), то снятие сеанса АХ вообще ничего не даст - пока процедура не отработает и не откатится - таблички, которые в ней задействованы - будут "под нагрузкой", т.е. повторный запуск этой хранимой процедуры из новой сессии АХ не даст ровным счетом ничего, кроме дополнительной нагрузки на сервер БД.
- если запустилось построение большого и толстого индекса, то снятие сеанса АХ опять-таки - ничего не даст.

Поэтому тут надо понимать, что снимая сеанс АХ - необходимо до этого кильнуть все пользовательские спиды этого сеанса на БД, потому что иначе все будут терпеливо ждать окончания выполнения запроса, а затем ждать отката (ROLLBACK). Удаление (KILL) спидов на БД позволит сократить время ожидания выполнения запроса (сразу пойдет ROLLBACK). Для крупных БД - это актуально. Для маленьких - нет.
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 03.05.2017 в 14:04.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AX2009 Batch run, deadlocks - как убить сессии? DSPIC DAX: Администрирование 11 15.12.2015 16:37
Форма активных пользователей (SysUsersOnline) и сессии COM-коннектора gl00mie DAX: Программирование 6 28.11.2009 11:45
Web портал и завершение сессии egorych DAX: Программирование 5 01.02.2008 18:27
Завершение AOS-ом сессии пользователя при рестарте SQL сервера vesna dba DAX: Администрирование 1 13.06.2007 09:02
aEremenko: Освобождение ресурсов сессии Blog bot DAX Blogs 0 26.12.2006 16:00

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:24.