|
152 | 152 | // Очистка завершенных контекстов через API фоновых заданий |
153 | 153 | // |
154 | 154 | Процедура ОчиститьЗавершенныеКонтексты_ЧерезAPI() |
155 | | - // TODO: Реализовать после изучения полной документации API ФоновыеЗадания |
156 | | - // Пока что заглушка для будущей реализации |
157 | | - |
158 | | - // Предполагаемая логика: |
159 | | - // 1. Получить список активных фоновых заданий |
160 | | - // 2. Сравнить контексты (UUID-формат) с идентификаторами активных заданий |
161 | | - // 3. Освободить соединения для завершенных заданий |
| 155 | + Попытка |
| 156 | + // Получаем список всех контекстов, привязанных к соединениям |
| 157 | + КонтекстыДляПроверки = Новый Массив; |
| 158 | + Для Каждого Элемент Из Карта_КонтекстНаКоннектор Цикл |
| 159 | + КонтекстыДляПроверки.Добавить(Элемент.Ключ); |
| 160 | + КонецЦикла; |
| 161 | + |
| 162 | + // Проверяем каждый контекст |
| 163 | + Для Каждого КонтекстID Из КонтекстыДляПроверки Цикл |
| 164 | + КонтекстЗавершен = ПроверитьЗавершениеКонтекста(КонтекстID); |
| 165 | + Если КонтекстЗавершен Тогда |
| 166 | + ОсвободитьКонтекст(КонтекстID); |
| 167 | + КонецЕсли; |
| 168 | + КонецЦикла; |
| 169 | + |
| 170 | + Исключение |
| 171 | + // Если произошла ошибка при работе с API, просто игнорируем |
| 172 | + // Эвристическая очистка сработает как запасной вариант |
| 173 | + КонецПопытки; |
162 | 174 | КонецПроцедуры |
163 | 175 |
|
| 176 | +// Проверить, завершен ли контекст (фоновое задание или основной поток) |
| 177 | +// |
| 178 | +// Параметры: |
| 179 | +// КонтекстID - Строка - Идентификатор контекста для проверки |
| 180 | +// |
| 181 | +// Возвращаемое значение: |
| 182 | +// Булево - Истина, если контекст завершен и может быть освобожден |
| 183 | +// |
| 184 | +Функция ПроверитьЗавершениеКонтекста(КонтекстID) |
| 185 | + // Проверяем, является ли контекст фоновым заданием |
| 186 | + // Контексты фоновых заданий имеют специальный формат или могут быть идентифицированы |
| 187 | + |
| 188 | + // Простая эвристика: если контекст содержит UUID-подобную структуру, |
| 189 | + // предполагаем, что это может быть ID фонового задания |
| 190 | + Если СтрДлина(КонтекстID) = 36 И СтрЧислоВхождений(КонтекстID, "-") = 4 Тогда |
| 191 | + // Похоже на UUID фонового задания - проверяем через API |
| 192 | + Возврат ПроверитьСтатусФоновогоЗадания(КонтекстID); |
| 193 | + КонецЕсли; |
| 194 | + |
| 195 | + // Для обычных контекстов (типа "Контекст_123") используем временную эвристику |
| 196 | + // В реальной реализации здесь может быть проверка потоков |
| 197 | + Возврат Ложь; // Предполагаем, что контекст еще активен |
| 198 | +КонецФункции |
| 199 | + |
| 200 | +// Проверить статус фонового задания по ID |
| 201 | +// |
| 202 | +// Параметры: |
| 203 | +// ЗаданиеID - Строка - Идентификатор фонового задания |
| 204 | +// |
| 205 | +// Возвращаемое значение: |
| 206 | +// Булево - Истина, если задание завершено |
| 207 | +// |
| 208 | +Функция ПроверитьСтатусФоновогоЗадания(ЗаданиеID) |
| 209 | + Попытка |
| 210 | + // В OneScript может быть доступен метод для получения задания по ID |
| 211 | + // Пока используем заглушку, так как точный API неизвестен |
| 212 | + |
| 213 | + // Предполагаемый код (когда API будет доступен): |
| 214 | + // Задание = ФоновыеЗадания.НайтиПоИдентификатору(ЗаданиеID); |
| 215 | + // Если Задание <> Неопределено Тогда |
| 216 | + // Возврат Задание.Состояние = СостояниеФоновогоЗадания.Завершено |
| 217 | + // ИЛИ Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно; |
| 218 | + // КонецЕсли; |
| 219 | + |
| 220 | + Возврат Ложь; // Консервативный подход - не освобождаем, пока не уверены |
| 221 | + |
| 222 | + Исключение |
| 223 | + Возврат Ложь; // При ошибке считаем задание активным |
| 224 | + КонецПопытки; |
| 225 | +КонецФункции |
| 226 | + |
164 | 227 | // Эвристическая очистка контекстов для предотвращения утечек памяти |
165 | 228 | // |
166 | 229 | Процедура ОчиститьЗавершенныеКонтексты_Эвристически() |
|
0 commit comments