Всем привет.
Имеется простой телеграм-бот. Служба получает входящие сообщения исходящим методом getUpdates "длинным запросом" Long polling по 7 сек.
Длинный запрос getUpdates запускается по таймеру раз в 500мс если входящие пустые, или сразу после обработки входящих сообщений.
Телеграм библиотеки не используются никакие. Все обычными HTTP запросами через indy компоненту TidHTTP
Стабильный эффект наблюдаю.
Если пропадает инет (свет в доме выключен, провода перетыкаю, и т.д.) то служба виснет.
В коде у меня всё, что только можно обернуто в try except но в логах нет никаких отметок.
Я так понимаю есть варианта возникновения ситуации.
1. между длинными запросами.
2. разрыв во время выполнения длинного запроса
В первом случае можно сначала выполнить пинг запрос HEAD для проверки доступности сервера.
А вот во втором случае не понятно, что делать.
Посоветуйте пожалуйста, что можно сделать?
Что угодно, но без существенной пересборки проекта.
Служба с INDY виснет при исчезновении интернета.
Модератор: Модераторы
На вскидку.
1. Включить TCP KeepAlive
По идее, если будет разрыв соединения, то ОС сама разорвёт сокет и TIdHTTP выбросит исключение вместо зависания.
2. Попробовать замерять время. Если запрос не вернулся за заданное время - уничтожать и создавать TIdHTTP заново.
1. Включить TCP KeepAlive
Код: Выделить всё
// В OnConnected
with TIdHTTP(Sender) do
if Assigned(Socket) then
Socket.SetKeepAliveValues(True, 60000, 5000);
2. Попробовать замерять время. Если запрос не вернулся за заданное время - уничтожать и создавать TIdHTTP заново.
Телеграмм боты это зло, вообще любые боты это зло. И очень правильно что все зависает ведь ОС пытается защитить людей от ереси.
Компьютер был придуман в помощь человеку, а не для порчи настроения ботами.
Что могло быть:
1. Запись логов при синхронизации в клин встала
2. Сменился IP и север неправильно обрабатывает ситуацию
Короче ставить запись логов и смотреть.
Компьютер был придуман в помощь человеку, а не для порчи настроения ботами.
Что могло быть:
1. Запись логов при синхронизации в клин встала
2. Сменился IP и север неправильно обрабатывает ситуацию
Короче ставить запись логов и смотреть.
Предложения в порядке "мозгового штурма ":
1 Простые "try except" помогают невсегда (мене в похожей ситуации помог DeepSeek предложив более жесткий контроль компонента TlistView, возможно что-то похожие поможет и в этом случае )
2 Возможно нужно принудительно установить тайм-аут в TIdHTTP.
3 Еще можно "обернуть" проблемный код потоком и проверять тайм-аут самостоятельно.
1 Простые "try except" помогают невсегда (мене в похожей ситуации помог DeepSeek предложив более жесткий контроль компонента TlistView, возможно что-то похожие поможет и в этом случае )
2 Возможно нужно принудительно установить тайм-аут в TIdHTTP.
3 Еще можно "обернуть" проблемный код потоком и проверять тайм-аут самостоятельно.
По умолчанию в IdHttp он включен.WAYFARER писал(а):Включить TCP KeepAlive
IdHTTP.Socket.SetKeepAliveValues нет такой процедуры в TIdHTTP
Про KeepAlive посмотрел, и так понял это нужно чтобы держать сокет открытым для экономии времени на соединение.
Но у меня на каждой итерации создается TIdHttp.Create(nil) отрабатывает запрос и удаляется IdHttp.Free
Не понимаю как проблеме поможет keep-alive?
Добавлено спустя 42 минуты 17 секунд:В компонентах Indy TIdHTTP (на стороне клиента) и TIdHTTPServer (на стороне сервера) реализована концепция HTTP Keep-Alive, позволяющая выполнять несколько запросов и ответов по одному TCP-соединению, что повышает производительность за счет снижения затрат на установление новых соединений для каждого запроса.
---------
Мда сказочно я затупил.
Думал таймауты настроены, но оказалось нет.
Теперь прописал
Код: Выделить всё
IdHTTP_post.ConnectTimeout:=1000;
IdHTTP_post.ReadTimeout:={времядлинногозапроса+1}*1000;
В try except стала происходить отработка и в логах потеря соединения нормально отобразилась. А после появления коннекта нормально продолжилась работа.
Всем спасибо.
Вопрос закрыт.
jsa, нет. HTTP Keep Alive не есть TCP KeepAlive.
TCP KeepAlive реализован на уровне ядра ОС и его цель в проверки живо ли соединение. Как писал выше оно надо что бы получить исключение вместо зависания.
Добавлено спустя 5 минут 46 секунд:
TCP KeepAlive реализован на уровне ядра ОС и его цель в проверки живо ли соединение. Как писал выше оно надо что бы получить исключение вместо зависания.
Версия Indy какая? Сейчас попробую пример накидатьjsa писал(а):IdHTTP.Socket.SetKeepAliveValues нет такой процедуры в TIdHTTP
Добавлено спустя 5 минут 46 секунд:
потому что я перепутал, оно в IOHandler...jsa писал(а):IdHTTP.Socket.SetKeepAliveValues нет такой процедуры в TIdHTTP
10.6.3.11WAYFARER писал(а):Версия Indy какая?
Спасибо. Вроде как решил проблему.WAYFARER писал(а):Сейчас попробую пример накидать
