Мы используем следующий FTP-код Apache Commons Net для подключения к FTP-серверу, опрашиваем некоторые каталоги на наличие файлов и, если файлы найдены, получить их на локальный компьютер:
try {
logger.trace("Attempting to connect to server...");
// Connect to server
FTPClient ftpClient = new FTPClient();
ftpClient.setConnectTimeout(20000);
ftpClient.connect("my-server-host-name");
ftpClient.login("myUser", "myPswd");
ftpClient.changeWorkingDirectory("/loadables/");
// Check for failed connection
if(!FTPReply.isPositiveCompletion(ftpClient.getReplyCode()))
{
ftpClient.disconnect();
throw new FTPConnectionClosedException("Unable to connect to FTP server.");
}
// Log success msg
logger.trace("...connection was successful.");
// Change to the loadables/ directory where we poll for files
ftpClient.changeWorkingDirectory("/loadables/");
// Indicate we're about to poll
logger.trace("About to check loadables/ for files...");
// Poll for files.
FTPFile[] filesList = oFTP.listFiles();
for(FTPFile tmpFile : filesList)
{
if(tmpFile.isDirectory())
continue;
FileOutputStream fileOut = new FileOutputStream(new File("tmp"));
ftpClient.retrieveFile(tmpFile.getName(), fileOut);
// ... Doing a bunch of things with output stream
// to copy the contents of the file down to the local
// machine. Ommitted for brevity but I assure you this
// works (except when the WAR decides to hang).
//
// This was used because FTPClient doesn't appear to GET
// whole copies of the files, only FTPFiles which seem like
// file metadata...
}
// Indicate file fetch completed.
logger.trace("File fetch completed.");
// Disconnect and finish.
if(ftpClient.isConnected())
ftpClient.disconnect();
logger.trace("Poll completed.");
} catch(Throwable t) {
logger.trace("Error: " + t.getMessage());
}
Мызапланировано ли это запускать каждую минуту, каждую минуту.При развертывании в Tomcat (7.0.19) этот код прекрасно загружается и начинает работать без помех.Однако каждый раз, в тот или иной момент, кажется, что зависает .Под этим я подразумеваю:
- Нет дампов кучи
- Tomcat все еще работает (я вижу его pid и могу войти в приложение веб-менеджера)
- Внутриприложение менеджера, я вижу, что моя WAR все еще работает / запущена
catalina.out
, и в журнале моего приложения нет никаких признаков каких-либо исключений
Итак, JVMВсе еще работает.Tomcat все еще работает, и моя развернутая WAR все еще работает, но она просто зависает.Иногда работает в течение 2 часов, а затем зависает;в других случаях он работает в течение нескольких дней, а затем зависает.Но когда он зависает, он делает это между строкой, которая читает About to check loadables/ for files...
(которую я вижу в журналах), и строкой, которая читает File fetch completed.
(которую я не вижу).
Этоговорит мне, что зависание происходит во время фактического опроса / извлечения файлов, что указывает мне то же направление, что и на этот вопрос , который мне удалось найти, и который связан с взаимоблокировкой FTPClient.Это заставляет меня задуматься, если это те же проблемы (, если они есть, я с удовольствием удалю этот вопрос! ).Однако я не думаю, что верят они одинаковы (я не вижу одинаковых исключений в своих журналах).
Сотрудник упомянул, что это может быть "Пассив"против "Активного" FTP вещь.Не зная разницы, меня немного смущают поля FTPClient ACTIVE_REMOTE_DATA_CONNECTION_MODE
, PASSIVE_REMOTE_DATA_CONNECTION_MODE
и т. Д., И я не знал, что ТАК считает это потенциальной проблемой.
Так как я 'м, поймав Throwable
s в качестве последнего средства здесь, я бы ожидал увидеть что-то в журналах, если что-то идет не так.Ergo, я чувствую, что это определенная проблема зависания.
Есть идеи?К сожалению, я не знаю достаточно о внутренностях FTP, чтобы поставить точный диагноз.Может ли это быть что-то на стороне сервера?Связанный с FTP-сервером?