Я использую 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). Я не знаю, не повезло ли мне из-за ошибки, которая не произошла на моей локальной машине разработчика, или это на самом деле что-то не так с коммуникацией моего подрядчика с удаленным сервером?