Имя: Пароль:
1C
1С v8
"выгонялка" подвисает в месте, где нужно получить соединения ИБ
0 GANR
 
02.08.11
10:10
Имеется такая "выгонялка" пользователей:

   МенеджерДС = Константы.мдмДанныеСеансов;
   МД_ДанныеСеансов = Метаданные.Константы.мдмДанныеСеансов;
   МД_РегламентноеЗадание = Метаданные.РегламентныеЗадания.мдмОбновлениеСтатистикиПодключений;
   
   МенеджерДС = Константы.мдмДанныеСеансов;
   ДанныеСеансов = МенеджерДС.Получить().Получить();
   
   ВсеПятиминуткиСеансов = Неопределено;
   СинхронизацияНачалаСеансов    = Неопределено;
   ВсеПятиминуткиСеансовСервер    = Неопределено;
   
   Если ТипЗнч(ДанныеСеансов) <> Тип("Структура") Тогда
       ДанныеСеансов = Новый Структура("ВсеПятиминуткиСеансов, ВсеПятиминуткиСеансовСервер, СинхронизацияНачалаСеансов");
   КонецЕсли;
   
   ДанныеСеансов.Свойство("ВсеПятиминуткиСеансов", ВсеПятиминуткиСеансов);
   Если Не ЗначениеЗаполнено(ВсеПятиминуткиСеансов) Тогда
       ВсеПятиминуткиСеансов = Новый Массив;
   КонецЕсли;
   
   ДанныеСеансов.Свойство("ВсеПятиминуткиСеансовСервер", ВсеПятиминуткиСеансовСервер);
   Если Не ЗначениеЗаполнено(ВсеПятиминуткиСеансовСервер) Тогда
       ВсеПятиминуткиСеансовСервер = Новый Массив;
   КонецЕсли;    
   
   ДанныеСеансов.Свойство("СинхронизацияНачалаСеансов", СинхронизацияНачалаСеансов);
   Если Не ЗначениеЗаполнено(СинхронизацияНачалаСеансов) Тогда
       СинхронизацияНачалаСеансов = Новый Соответствие;
   КонецЕсли;
   
   СинхронизацияНачалаСеансов.Очистить();
   
   КоличествоПятиминутокПростоя = Константы.мдмКоличествоПятиминутокПростоя.Получить();
   КоличествоПятиминутокПростоя = ?(ЗначениеЗаполнено(КоличествоПятиминутокПростоя), КоличествоПятиминутокПростоя, 2);
   
   КоличествоПятиминутокПростояСервер = Константы.мдмКоличествоПятиминутокПростояСервер.Получить();
   КоличествоПятиминутокПростояСервер = ?(ЗначениеЗаполнено(КоличествоПятиминутокПростояСервер), КоличествоПятиминутокПростоя, 3);    
   
   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
   |    IT_ВИБ.Кластер КАК Кластер,
   |    IT_ВИБ.КорневойУзелИБ.ИмяБазыДанных КАК База,
   |    IT_ВИБ.ПодключениеПоУмолчанию.Пользователь КАК ПользовательБазы,
   |    IT_ВИБ.ОтключениеПоУмолчанию.Пользователь КАК ПользовательОтключение,
   |    IT_ВИБ.ОтключениеПоУмолчанию.Пароль КАК ПарольОтключение,
   |    IT_ВИБ.КорневойУзелИБ.ПерекличекЗа5Минут КАК ПерекличекЗа5Минут,
   |    IT_ВИБ.Кластер.ПодключениеПоУмолчанию.Пользователь КАК ПользовательКластер,
   |    IT_ВИБ.Кластер.ПодключениеПоУмолчанию.Пароль КАК ПарольКластер,
   |    IT_ВИБ.Кластер.ИмяСервера КАК ИмяСервераКластер,
   |    IT_ВИБ.Кластер.Порт КАК ПортКластер
   |ИЗ
   |    Справочник.IT_ВнешниеИнформационныеБазы КАК IT_ВИБ
   |ГДЕ
   |    IT_ВИБ.ПодключениеПоУмолчанию <> ЗНАЧЕНИЕ(Справочник.IT_ПодключенияКВИБ.ПустаяСсылка)
   |    И IT_ВИБ.ОтключениеПоУмолчанию <> ЗНАЧЕНИЕ(Справочник.IT_ПодключенияКВИБ.ПустаяСсылка)
   |    И IT_ВИБ.КорневойУзелИБ <> ЗНАЧЕНИЕ(Справочник.IT_УзлыИБ.ПустаяСсылка)
   |    И IT_ВИБ.КорневойУзелИБ.СерверныйРежим = 0
   |    И IT_ВИБ.Кластер <> ЗНАЧЕНИЕ(Справочник.IT_Оборудование.ПустаяСсылка)
   |    И IT_ВИБ.Кластер.ПодключениеПоУмолчанию <> ЗНАЧЕНИЕ(Справочник.IT_ПодключенияКВИБ.ПустаяСсылка)
   |ИТОГИ ПО
   |    Кластер";
   
   Результат = Запрос.Выполнить();
   ВыборкаКластер = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   
   //НаборСвойств = "AppID, ConnID, ConnectedAt, DBConnMode, HostName, IBConnMode, blockedByDBMS, bytesAll, bytesLast5Min, callsAll, callsLast5Min,
   //|dbProcInfo, dbProcTook, dbProcTookAt, dbmsBytesAll, dbmsBytesLast5Min, durationAll, durationAllDBMS, durationCurrent, durationCurrentDBMS, durationLast5Min,
   //|durationLast5MinDBMS, userName";
   СтруктураСоединения = Новый Структура("ConnID, callsLast5Min");
   ПоследняяПятиминутка = Новый Массив;
   Коннектор = Новый COMОбъект("v82.COMConnector");
   
   Пока ВыборкаКластер.Следующий() Цикл        
       
       СерверКластер = СокрЛП(ВыборкаКластер.ИмяСервераКластер);
       ПортКластер = СокрЛП(ВыборкаКластер.ПортКластер);
       ПользовательКластер = СокрЛП(ВыборкаКластер.ПользовательКластер);
       ПарольКластер = СокрЛП(ВыборкаКластер.ПарольКластер);        
       
       ЗаписьЖурналаРегистрации("Обновление статистики активности сеансов", УровеньЖурналаРегистрации.Информация, МД_РегламентноеЗадание, , "Просмотр кластера " + СерверКластер + ":" + ПортКластер) ;
       
       Агент = Коннектор.ConnectAgent(СерверКластер + ":" + ПортКластер);
       Кластеры = Агент.GetClusters();
       
       Для Каждого Кластер Из Кластеры Цикл
                       
           // получим и переберем процессы кластера    
           Агент.Authenticate(Кластер, ПользовательКластер, ПарольКластер);
           Процессы = Агент.GetWorkingProcesses(Кластер);
           
           Для Каждого Процесс Из Процессы Цикл
               
               Если Процесс.MainPort = 0 Тогда
                   Продолжить;
               КонецЕсли;
               
               ПортПроцесса = СтрЗаменить(СокрЛП(Процесс.MainPort), Символы.НПП, "");
               Выборка = ВыборкаКластер.Выбрать();
               
               Пока Выборка.Следующий() Цикл
                   
                   // теперь есть адрес и порт для подключения к рабочему процессу    
                   РабПроц = Коннектор.ConnectWorkingProcess(СерверКластер + ":" + ПортПроцесса);
                   // логин админа кластера
                   РабПроц.AuthenticateAdmin(ПользовательКластер, ПарольКластер);                    
                   // логин админа базы                    
                   РабПроц.AddAuthentication(Выборка.ПользовательОтключение, Выборка.ПарольОтключение);
                   ИнформационнаяБаза = РабПроц.CreateInfoBaseInfo();
                   ИнформационнаяБаза.Name = Выборка.База;
                   Попытка
                       СоединенияБазы = РабПроц.GetInfoBaseConnections(ИнформационнаяБаза);
                   Исключение
                       ЗаписьЖурналаРегистрации("Обновление статистики активности сеансов", УровеньЖурналаРегистрации.Ошибка, МД_РегламентноеЗадание, , "Для базы " + СокрЛП(Выборка.База) + " не удалось получить подключения " + ОписаниеОшибки());
                       Продолжить;
                   КонецПопытки;
                   
                   //Разорвать соединения клиентских приложений.
                   Для Каждого Соединение Из СоединенияБазы Цикл
                       
                       Если Соединение.userName = Выборка.ПользовательБазы И Соединение.AppID = "1CV8" Тогда
                           
                           ConnID = Соединение.ConnID;
                           callsLast5Min = Соединение.callsLast5Min;
                           СинхронизацияНачалаСеансов.Вставить(Соединение.ConnID, Соединение.ConnectedAt);
                           МинимальноеЧислоПерекличек = ?(ЗначениеЗаполнено(Выборка.ПерекличекЗа5Минут), Выборка.ПерекличекЗа5Минут, 25);
                           СоединениеНужноОтключить = callsLast5Min <= МинимальноеЧислоПерекличек;
                           
                           Если СоединениеНужноОтключить = Истина Тогда
                               ИндексДС = 0;
                               Пока СоединениеНужноОтключить = Истина И ИндексДС <= ВсеПятиминуткиСеансовСервер.Количество() - 1 Цикл
                                   ПятиминуткаСеансов = ВсеПятиминуткиСеансовСервер[ИндексДС]; ИндексТС = 0;
                                   Пока СоединениеНужноОтключить = Истина И ИндексТС <= ПятиминуткаСеансов.Количество() - 1 Цикл
                                       СоединениеНужноОтключить = ConnID <> ПятиминуткаСеансов[ИндексТС];
                                       ИндексТС = ИндексТС + 1;
                                   КонецЦикла;
                                   ИндексДС = ИндексДС + 1;
                               КонецЦикла;
                           Иначе
                               ПоследняяПятиминутка.Добавить(ConnID);
                           КонецЕсли;
                           
                           Если СоединениеНужноОтключить = Истина Тогда
                               Попытка
                                   РабПроц.Disconnect(Соединение);
                                   ЗаписьЖурналаРегистрации("Обновление статистики активности сеансов", УровеньЖурналаРегистрации.Предупреждение, МД_РегламентноеЗадание, , "Сеанс " + ConnID + " принудительно отключен фоновым заданием");
                               Исключение
                                   ЗаписьЖурналаРегистрации("Обновление статистики активности сеансов", УровеньЖурналаРегистрации.Ошибка, МД_РегламентноеЗадание, , "Сеанс " + ConnID + " не удалось отключить фоновым заданием " + ОписаниеОшибки());
                               КонецПопытки;
                           КонецЕсли;
                       КонецЕсли;                                        
                   КонецЦикла;
               КонецЦикла;
           КонецЦикла;
       КонецЦикла;
   КонецЦикла;
   
   ВсеПятиминуткиСеансов.Добавить(ПоследняяПятиминутка);
   Пока ВсеПятиминуткиСеансов.Количество() > КоличествоПятиминутокПростоя Цикл
       ВсеПятиминуткиСеансов.Удалить(0);
   КонецЦикла;
   
   ВсеПятиминуткиСеансовСервер.Добавить(ПоследняяПятиминутка);
   Пока ВсеПятиминуткиСеансовСервер.Количество() > КоличествоПятиминутокПростояСервер Цикл
       ВсеПятиминуткиСеансовСервер.Удалить(0);
   КонецЦикла;    
   
   НоваяСтруктура = Новый Структура("ВсеПятиминуткиСеансов, ВсеПятиминуткиСеансовСервер, СинхронизацияНачалаСеансов", ВсеПятиминуткиСеансов, ВсеПятиминуткиСеансовСервер, СинхронизацияНачалаСеансов);
   МенеджерДС.Установить(Новый ХранилищеЗначения(НоваяСтруктура));

В строчке
                   Попытка
                       СоединенияБазы = РабПроц.GetInfoBaseConnections(ИнформационнаяБаза);
                   Исключение
                       ЗаписьЖурналаРегистрации("Обновление статистики активности сеансов", УровеньЖурналаРегистрации.Ошибка, МД_РегламентноеЗадание, , "Для базы " + СокрЛП(Выборка.База) + " не удалось получить подключения " + ОписаниеОшибки());
                       Продолжить;
                   КонецПопытки;
при попытке получить соединения одной из 8 баз (остальные нормально отрабатывает) программа останавливается в этой точке и не хочет идти дальше по многу дней :). В чем дело?
1 GANR
 
02.08.11
10:11
В строчке

                   Попытка
                       СоединенияБазы = РабПроц.GetInfoBaseConnections(ИнформационнаяБаза);
                   Исключение
                       ЗаписьЖурналаРегистрации("Обновление статистики активности сеансов", УровеньЖурналаРегистрации.Ошибка, МД_РегламентноеЗадание, , "Для базы " + СокрЛП(Выборка.База) + " не удалось получить подключения " + ОписаниеОшибки());
                       Продолжить;
                   КонецПопытки;

при попытке получить соединения одной из 8 баз (остальные нормально отрабатывает) программа останавливается в этой точке и не хочет идти дальше по многу дней :). В чем дело?