После получения нескольких файлов я получаю сообщение об ошибке «425 не может открыть соединение для передачи данных для передачи файла» - PullRequest
0 голосов
/ 07 июня 2019

Я использую apache commons-net FTPClient (версия 3.3), и на одном из моих клиентских компьютеров возникла ошибка ниже (я безуспешно пытался воспроизвести ошибку на своем компьютере разработчика, используя папку тестирования с теми же запросами на тот же сервер с тем же логином)

У меня есть процесс, который проверяет, есть ли на удаленном FTP-сервере новые запросы в виде XML-файлов. После перечисления всех этих файлов я продолжаю в цикле, чтобы проверить, находятся ли они в формате XML. Если файл в этом формате, я сначала изменяю его имя, меняя формат с * .xml на * .xmlProcessing, извлекаю их во входной поток, анализирую их в моем объекте и создаю запрос в моей очереди и, наконец, меняю имя и переместите их в подпапку, работающую как архив.

После загрузки произвольного количества файлов я застреваю при вызове retrieveFileStream для следующего файла без тайм-аута или исключения IO.

Мне удалось получить логи с FTP-сервера, и он просто говорит, что не может открыть соединение для передачи данных

05.06.2019 12:45:45 -  > RNFR /folder/file.xml

05.06.2019 12:45:45 -  > 350 File exists, ready for destination name.

05.06.2019 12:45:45 -  > RNTO /folder/file.xmlProcessing

05.06.2019 12:45:45 -  > 250 file renamed successfully

05.06.2019 12:45:45 -  > PORT *ports*

05.06.2019 12:45:45 -  > 200 Port command successful

05.06.2019 12:45:45 -  > RETR /folder/file.xmlProcessing

05.06.2019 12:45:45 -  > 150 Opening data channel for file download from server of "/folder/file.xmlProcessing"

05.06.2019 12:45:45 -  > 425 Can't open data connection for transfer of "/folder/file.xmlProcessing"

Я уже пробовал разные режимы FTP. Активный локальный, удаленный, пассивный и т. Д. (В настоящее время заблокирован пассивный локальный режим).

Я попробовал тайм-аут данных, но похоже, что когда я, наконец, застрял в одном из файлов, метод занял более 1 минуты для этого файла, несмотря на то, что я установил тайм-аут на 30 с.

ftp = new FTPClient();
ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
ftp.connect(server, port);
int reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
    ftp.disconnect();
    throw new IOException("Exception in connecting to FTP Server");
}
ftp.login(user, password);
ftp.enterLocalPassiveMode();
ftp.setKeepAlive(true);
ftp.setDataTimeout(30000);
Collection<String> listOfFiles = listFiles(FOLDER_PATH);
for(String filePath : listOfFiles){
  if (filePath != null && filePath.endsWith(".xml")) {
     ftp.rnfr(folder + filePath);
     ftp.rnto(folder + filePath + "Processing");
     InputStream fileInputStream = ftp.retrieveFileStream(folder + filePath + "Processing");
     ftp.completePendingCommand();
     //Parsing file to an instance of my object and creating request
     ftp.rnfr(folder + filePath + "Processing");
     ftp.rnto(archiveFolder + filePath);
     if(fileInputStream != null){
    fileInputStream.close();
     }
  }
}

Есть большая вероятность того, что это ошибка FTP-сервера, проблемы с брандмауэром или что-то еще?

Я запустил тот же код с моей машины разработчика, и он обработал все файлы из тестовой папки (их было около 400). Я не знаю, не повезло ли мне из-за ошибки, которая не произошла на моей локальной машине разработчика, или это на самом деле что-то не так с коммуникацией моего подрядчика с удаленным сервером?

1 Ответ

0 голосов
/ 07 июня 2019

Каждый раз, когда вы выполняете передачу файла или список каталогов с помощью FTP, сервер (или клиент, если используется активный режим) назначает случайный номер порта из заданного диапазона для этой передачи.Номер порта не освобождается сразу после завершения передачи.Есть некоторый перезарядка интервал.Если вы выполняете слишком много передач файлов за короткий промежуток времени, может случиться так, что серверу не хватит доступных портов - поскольку все порты находятся в состоянии перезарядки.

Если вы можете, проверьте конфигурацию сервераи настройте больший диапазон портов.

Или в качестве обходного пути вы можете попытаться замедлить скорость передачи.

Для получения дополнительной информации см.


Хотя это всего лишь предположение, вы должны проверить журнал сервера, поскольку он может показать более подробную информацию.

Другая возможность состоит в том, что просто ограниченоколичество передач, разрешенных сервером для определенного пользователя или адреса источника в некоторый интервал времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...