Всем привет!
Обращаюсь к вам за советом, как реализовать запуск обработки в фоне, которая будет работать в режиме 24\7
Сейчас это работает так. Есть батник (.bat), который запускается на серваке планировщиком заданий под конкретным пользователем. Кратко - он запускает 1С и обработку, а также проверяет каждую минуту, что процесс 1С все еще активен. Если не активен, то запускает себя сам снова.
Обработка запускает еще кучу обработок - на каждого телеграмм бота свою из справочника внешние обработки. Все настройки ботов на регистрах сделаны.
В обработке выполняется метод встроенного языка "ПодключитьОбработчикОжидания" и каждые 5 секунд делается проверка, были ли переданы боту сообщения и если да, то выполнить эти команды.
Внимание вопрос.
Можно ли в фоновом задании сделать так, чтобы по завершению выполнения обработки фоновое задание не завершалось, а выполняло проверку далее.
Ведь, если сделать запуск регламентированного задания каждые 5 секунд, то сервер точно ляжет.
Конечно, будет запуск только одной обработки, которая станет за одно выполнение процедуры обходить всех ботов и выполнять их запросы.
В рамках данного вопроса спрошу вот еще что. Может мне это поможет и я оставлю все на батнике.
Если процесс 1С убить или он зависнет, то батник будет продолжать видеть запущенный процесс 1С. Как быть в такой ситуации?
Думал над запуском каждые 1-2 часа другого батника, убивающего все процессы 1С, но это радикальный метод. Может запрос бота обработать некорректно в момент отключения.
Думал над таким извращением как запуск в фоновом задании обработки, которая будет проверять - запущен ли сеанс пользователя (все через метод встроенного языка "ПолучитьСоединенияИнформационнойБазы") и если нет, то будет запускать батник, убивающий процессы 1С для конкретного пользователя (винды).
(1) А может попробовать весь фон перекинуть на apache?
создать в 1с web-сервис и пусть апач каждые 5 сек вызывает твою обработку.
зато 1с не будет висеть, вся нагрузка ляжет на другой сервак
реализовать это вроде не сложно если знаешь как с xdto работать.
у меня запуск производится раз в 10 минут
иногда фоновое задание выполняется больше приходится ограничивать
Если ИнтерективныйЗапуск Тогда
Попытка
ФоновоеЗадание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.СКД_ЗагрузкаЖурналаСобытий).ПоследнееЗадание;
Если ФоновоеЗадание <> Неопределено И ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.Активно Тогда // продолжать нет смысла
Сообщить(НСтр("ru = 'Загрузка новых событий выполняется другим процессом.'"));
Возврат Ложь;
КонецЕсли;
Исключение
// Возможно менеджер фоновых заданий не активен, продолжим выполнение кода
КонецПопытки;
КонецЕсли;
Д_ЗагрузкаЖурналаСобытий).ПоследнееЗадание;
Если ФоновоеЗадание <> Неопределено И ФоновоеЗадание.Состояние =
Да, это очень поможет, спасибо. Только для другой задачи, хах.
Пока что остаюсь верным идее с батником. Обновление каждые 5-10 секунд для пару десятков ботов - это круто, но с этим не справится регламентное задание.
И самое то главное, вчера в процессе тестирования обнаружил (вспомнил) одну особенность. Пользователь, чтобы получить информацию из 1С от бота, должен сначала авторизироваться, а затем кнопками выбрать действия. Так вот. Если обработку закрыть и открыть снова, то авторизироваться придется снова. А это вовсе никуда не годится.
Думаю сделать так.
В момент, когда обработка будет запущена (перезапущена) выполнится следующий код. На все запросы отвечать "перезагрузка бота завершена, повторите авторизацию" (либо вообще ничего не отправлять).
И перезапуск всех процессов 1С:
taskkill /fi "username eq MY_USER" /IM 1cv8.exe /f
Где
MY_USER - имя пользователя
MY_FOLDER1\MY_FOLDER2 - путь расположения базы
MY_USER_1C - имя пользователя 1С
MY_PASSWORD - пароль пользователя (вроде как быть обязан для запуска из cmd)
MY_FOLDER_WHERE_EPF\start_all_bots.epf - путь к обработке, которую нужно запустить
делал такое. только фоновое задание запускалось однократно и висело постоянно.
вечный цикл "пока Истина", чтоб не было зависаний, и сервер не молотил это задание постоянно - обращение к оболочке - команда таймаут на 1 секунду.
Если обработку закрыть и открыть снова, то авторизироваться придется снова. А это вовсе никуда не годится.
и авторизацию не придется делать снова.
P.S. на файловой базе такой метод требует доп настройки = пришлось выделить 1 сеанс отдельный, на котором был разрешен запуск этого регламентного, в остальных сеансах запуск был запрещен, иначе такое вечное регламентное - не давало запустится остальным регламентным.
(7) А в фоне вечный цикл только одну обработку выполнял?
Да, отдельный пользователь на сервере. Отдельный пользователь в 1С. Ну это нормально.
Вот есть проблема. Для каждого бота нужно запускать отдельную обработку (там все заточено на одного бота, переделывать ее уже не стану, двойная работа).
Сейчас батник запускает обработку, которая запускает на каждого бота отдельную обработку, а сама проверят каждые минут 30, появился ли новый бот.
В общем, понял, если делать на регламентных заданиях, все переделывать придется. Так что не вариант. Но за совет спасибо.
Расскажите, какие проблемы возникали при вечном цикле в фоне? Ни разу не использовал, боязно такую бомбу делать :)
(9) регламентное запускалось один раз, с миллионом попыток перезапуска (на случай если сервак выключат/перезагрузят).
в самом регламентном не было вызова обработок, все было в коде процедуры, сама процедура выполняла https запросы и обрабатывала их ответы, после получения и обработки - таймаут системе, иначе реально сервер ляжет. авторизация выполнялась перед циклом, далее авторизация повторялась если по каким то причинам соединение сбрасывалось (например сбой интернета), и т.д....
Если боязно - поставь таймаут 5 секунд, в моем регламентном таймаут был 1 секунда, хотя поначалу тоже ставил 5,потом 2.
проблемы возникали только на файловой базе - и то, нашли решение (отдельный сеанс) и нормально работало и на файловых.
На данный момент это часть коммерческого решения, и успешно работает более чем на 20 (насколько мне известно) различных базах с различными конфигурациями.
Хотя, по уму, решение действительно нерекомендуемое, т.к. разумнее написать свой модуль на C++ или еще каком то языке программирования, и запускать его отдельно от 1С, ловя и обрабатывая от него только внешние события.
(10) Звучит прекрасно. Одно задание, никаких батников.
Завтра вечером попробую этот вариант - с вечным циклом. Переделаю обработку на обход всех ботов, чтобы не запускать отдельную обработку на каждого.
(12)
так запуск один раз, никаких дублей задания не может быть. а чтоб перезапускалось при перезагрузке сервера - миллион попыток).
могу вечером из дома скинуть вырезку основного кода без начинки. судя по описанию задачи вам должен подойти такой вариант.