Как в 8.3 определить и удалить спящие сеансы?
Всем привет!
Платформа 8.3.7.2027 конфигурация на БСП,формы управляемые
Как определить и удалить спящие сеансы?
Если работать через Конфигуратор-Параметры информационной базы и тут выставить интервал засыпания и отключения сеанса.
результата не будет тк подключены клиентские обработчики по проверке наличия блокировки работы в базе и прочее.
Есть какое нибудь красивое решение?
Платформа 8.3.7.2027 конфигурация на БСП,формы управляемые
Как определить и удалить спящие сеансы?
Если работать через Конфигуратор-Параметры информационной базы и тут выставить интервал засыпания и отключения сеанса.
результата не будет тк подключены клиентские обработчики по проверке наличия блокировки работы в базе и прочее.
Есть какое нибудь красивое решение?
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) А зачем это из кода делать?
Если я правильно понимаю суть, то сеанс становится спящим, если клиент долгое время не пингует сервер (1с-ники приводят пример закрытой крышки ноутбука в веб-клиенте). А потом сама платформа, через установленный тайм-аут, отстреливает эти сеансы. По крайней мере так на партнерке писали
Причем начиная с какой-то версии (точно не помню) спящие сеансы перестали занимать лицензии. Да и не мешают они ничему (в первом приближении).
А еще вот цитата из партнерки:
Если я правильно понимаю суть, то сеанс становится спящим, если клиент долгое время не пингует сервер (1с-ники приводят пример закрытой крышки ноутбука в веб-клиенте). А потом сама платформа, через установленный тайм-аут, отстреливает эти сеансы. По крайней мере так на партнерке писали
Причем начиная с какой-то версии (точно не помню) спящие сеансы перестали занимать лицензии. Да и не мешают они ничему (в первом приближении).
А еще вот цитата из партнерки:
Если время засыпания пассивных сеансов установить в 1200 секунд, а время жизни спящих сеансов установить в 1 секунду, то поведение сеанов сведется к поведению сенсов в предыдущих версиях платформы, когда понятие спящего сеанса отсутствовало.
&НаКлиенте
Процедура УдалитьСпящиеСеансыЭтойБазы(Команда)
УдалитьСпящиеСеансыЭтойБазыНаСервере();
КонецПроцедуры
&НаСервере
Процедура УдалитьСпящиеСеансыЭтойБазыНаСервере()
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
Если Лев(СтрокаСоединения, 5) <> "Srvr=" Тогда
Сообщить("Это не клиент-серверное соединение");
Возврат
КонецЕсли;
ИмяСервера = Сред(СтрокаСоединения, 7);
ИмяСервера = Лев(ИмяСервера, Найти(ИмяСервера, """") - 1);
ПортСервера = 1540;
ПортКластера = 1541;
ПозицияДвоеточия = Найти(ИмяСервера, ":");
Если ПозицияДвоеточия > 0 Тогда
ПортКластера = Число(Сред(ИмяСервера, ПозицияДвоеточия + 1));
ПортСервера = ПортКластера - 1;
ИмяСервера = Лев(ИмяСервера, ПозицияДвоеточия - 1);
КонецЕсли;
СерверИПорт = ИмяСервера + ":" + Формат(ПортСервера, "ЧГ=");
ИмяБазы = Сред(СтрокаСоединения, Найти(СтрокаСоединения, "Ref=") + 5);
ИмяБазы = Лев(ИмяБазы, Найти(ИмяБазы, """") - 1);
Соединитель = Новый COMОбъект("V83.COMConnector");
СоединениеСАгентом = Соединитель.ConnectAgent(СерверИПорт);
// найдём наш кластер
НашКластер = Неопределено;
Для Каждого Кластер Из СоединениеСАгентом.GetClusters() Цикл
Если Кластер.MainPort = ПортКластера Тогда
НашКластер = Кластер;
Прервать
КонецЕсли;
КонецЦикла;
Если НашКластер = Неопределено Тогда
Сообщить("Кластер не найден");
Возврат
КонецЕсли;
// аутентификация в нашем кластере
ИмяАдминистратораКластера = "";
ПарольАдминистратораКластера = "";
СоединениеСАгентом.Authenticate(НашКластер, ИмяАдминистратораКластера, ПарольАдминистратораКластера);
// найдём нашу базу
НашаБаза = Неопределено;
Базы = СоединениеСАгентом.GetInfoBases(НашКластер);
Для Каждого База Из Базы Цикл
Если НРег(База.Name) = НРег(ИмяБазы) Тогда
НашаБаза = База;
Прервать
КонецЕсли;
КонецЦикла;
Если НашаБаза = Неопределено Тогда
Сообщить("База не найдена");
Возврат
КонецЕсли;
СеансыНашейБазы = СоединениеСАгентом.GetInfoBaseSessions(НашКластер, НашаБаза);
Для Каждого Сеанс Из СеансыНашейБазы Цикл
Если Сеанс.Hibernate Тогда
СоединениеСАгентом.TerminateSession(НашКластер, Сеанс);
Сообщить(Сеанс.SessionID);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
(5)
данные код поможет удалить сеансы если они признаны системой "спящими"
проблема в том что на типовых конфигурациях или на тех которые основаны на БСП.
подключены обработчики которые срабатывают с разными периодами.(мне известно пока о двух: проверка на наличие блокировки работы в базе и проверка на динамическое обновление)
эти обработчики не дают сеансу заснуть поэтому если пользователь отошёл от компа на 30 минут или на 10 дней.
в системе если сеанс не завис так и будет актиным...
данные код поможет удалить сеансы если они признаны системой "спящими"
проблема в том что на типовых конфигурациях или на тех которые основаны на БСП.
подключены обработчики которые срабатывают с разными периодами.(мне известно пока о двух: проверка на наличие блокировки работы в базе и проверка на динамическое обновление)
эти обработчики не дают сеансу заснуть поэтому если пользователь отошёл от компа на 30 минут или на 10 дней.
в системе если сеанс не завис так и будет актиным...
(11) Повторю (6) - неясно, зачем это нужно делать из кода. Кластер сам должен решать озвученные задачи (судя по РТФМу).
Либо есть что-то, что вам очевидно, а остальным нет. И это "тайное знание" мешает понять причину того, почему вам это надо.
Но общий вывод у вас правильный - задача средствами встроенного языка не реализуема, т.к. определение сонности сеанса лежит ниже уровня встроенного языка.
Либо есть что-то, что вам очевидно, а остальным нет. И это "тайное знание" мешает понять причину того, почему вам это надо.
Но общий вывод у вас правильный - задача средствами встроенного языка не реализуема, т.к. определение сонности сеанса лежит ниже уровня встроенного языка.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот