0
Samoyloff
05.12.12
✎
20:52
|
Хочу поделиться с форумом результатами секса с вышеуказанным объектом.
А может кто из форумчан заодно и более правильное решение подскажет.
Задача стояла элементарная:
На ФТП сервере лежит N папок. В каждой из них может быть или не быть некий файл. В зависимости от наличия/отсутствия выполняем некие действия, которые к сути поста отношения не имеют.
Реализация проста как бревно.
Создаем FTPСоединение, получаем список файлов на ФТП, отбрасываем то, что не является папками. В цикле пробегаем по папкам. Зашли в папку, поискали в ней файл, если нет файла - работаем, если есть - едем дальше.
Дальше чудеса. Если N <= 5 - всё ок, отлично отрабатывает и все счастливы, но если папок больше, то на очередной итерации цикла FTPСоединение вызывает исключение, а ФТП-сервер после этого в течение нескольких минут притворяется мёртвым.
А фишка оказалась вот в чем. В отличие от нормальных клиентов, наш объект FTPСоединение, вместо того, чтобы создать один управляющий канал и дальше спокойно в нем работать, при вызове каждой операции(Смена каталога, Поиск файлов, Заливка файл, и т.д) создает управляющий канал, делает требуемое, закрывает управляющий канал. Иными словами на каждую операцию создается свое отдельное соединение. А на любом ФТП сервере есть ограничение количества одновременных сессий. В итоге если достаточно часто(много раз в секунду) и достаточно долго обращаться к ФТП, то на сервере тупо забивается напрочь пул соединений, и он радостно говорит всем "Давай досвиданья".
Вылечилось добавлением в конец цикла задержки в 2 секунды. Серверу этого вполне хватает, чтобы понять, что соединения созданные в этой итерации уже позакрывались.
|
|