26.11.2009, 19:08 | #1 |
Участник
|
Форма активных пользователей (SysUsersOnline) и сессии COM-коннектора
После небольшого спора с коллегой, занимающимся 1С, на тему того, сколько сессий открывает COM-коннектор, работающий в качестве сервиса COM+, при одновременном доступе через него в Аксапту нескольких "внешних" приложений (в данном случае 1С), подумалось: а почему, собственно, в форме активных пользователей видна только одна сессия business connector'а? Ведь явно в описанном сценарии определенные операции выполняются параллельно, чего штатными средствами в рамках одной сессии достичь невозможно: AOS на каждую сессию создает один-единственный поток и обрабатывает запросы от клиента синхронно. И тут, просматривая сообщения в eventlog'е о том, как начинаются и завершаются соединения business connector'а, я обратил внимание, что у них очень специфический номер сессии: он начинается c 65534 и затем уменьшается по мере появления новых сессий, при этом освобождаемые при завершении сессий номера активно используются повторно (65535 - какая-то служебная сессия пользователя '-AOS-', которая явно пропускается в той же форме активных пользователей). В то же время, метод получения информации о сессиях, SysUsersOnline::getAllOnlineUserInfo(), обращается лишь к сессиям с номерами от 1 до info::licensedUsersTotal(), т.е. условно к первым сотням. Так вот, после небольшой модификации этого метода на форме активных пользователей появились дополнительные сессии, создаваемые business connector'ом с указанием - при наличии активных соединений с БД - их SPID/SID и проч. (показ Serial No, SID, INST_ID - это доработка). И теперь стало понятнее, почему при подключении COM-коннектора "свободные" сессии на AOS'е заканчиваются раньше, чем на той же форме активных пользователей начнет показываться предельное число активных сессий.
Не совсем пока понятно, что делать с сессиями, которые показываются с типом NotAOS - для них не создается экземпляр AOSSessionInfo, и вообще, если верить eventlog'у, они уже завершены, но объекты xSession для них создаются... Ниже приведена модификация SysUsersOnline::getAllOnlineUserInfo() для отображения таких сессий. X++: #define.MaxSessionId (65535) //+Отображать все COM-соединения в активных пользователях, gl00m, 26.11.2009 server static container getAllOnlineUserInfo() { int counter; int num; int maxSessions = Info::licensedUsersTotal(); int idleTicks; container users; container c; xSession session; UserInfo userInfo; AOSSessionInfo aosSession; AOSClientMode clientMode; // Отображать все COM-соединения в активных пользователях, gl00m, 26.11.2009 --> SetEnumerator setEnum; Set setOfSessionIds = new Set( typeof(counter) ); Counter cnAosUsers = info::licensedAosUsers(); // Отображать все COM-соединения в активных пользователях, gl00m, 26.11.2009 <-- ; if (!maxSessions) //Demo mode maxSessions = 3; num = 0; for(counter = 1; counter <= maxSessions;counter++) { // Отображать все COM-соединения в активных пользователях, gl00m, 26.11.2009 --> setOfSessionIds.add( counter ); } for (counter = #MaxSessionId - cnAosUsers; counter <= #MaxSessionId; counter++) { setOfSessionIds.add( counter ); } setEnum = setOfSessionIds.getEnumerator(); while (setEnum.moveNext()) { counter = setEnum.current(); // session = new xSession(counter, true); session = new xSession(counter, false); // NB! с параметром _checkSession == true ничего не выйдет // Отображать все COM-соединения в активных пользователях, gl00m, 26.11.2009 <-- Последний раз редактировалось gl00mie; 26.11.2009 в 19:14. |
|
|
За это сообщение автора поблагодарили: raz (5), Logger (10). |