Apache Commons FTPClient Hanging

Estamos utilizando el siguiente código FTP de Apache Commons Net para conectarse a un servidor FTP, sondear algunos directorios en busca de archivos y, si se encuentran archivos, recuperarlos en la máquina local:

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());
}

Tenemos esto programado para ejecutarse cada minuto, en el minuto. Cuando se implementa en Tomcat (7.0.19), este código se carga perfectamente bien y comienza a funcionar sin problemas. Sin embargo, cada vez, en algún momento u otro, parece que solocolga. Con eso quiero decir:

No existen descargas de almacenamiento dinámico Tomcat todavía se está ejecutando (puedo ver su pid y puedo iniciar sesión en la aplicación de administrador web) Dentro de la aplicación de administrador, puedo ver que mi WAR todavía se está ejecutando / iniciócatalina.out y mi registro específico de la aplicación no muestra signos de que se produzcan excepciones

Así que la JVM todavía se está ejecutando. Tomcat todavía se está ejecutando, y mi WAR desplegado todavía se está ejecutando, pero está colgando. A veces funciona durante 2 horas y luego se cuelga; otras veces se ejecuta durante días y luego se cuelga. Pero cuando se cuelga, lo hace entre la línea que diceAbout to check loadables/ for files... (que sí veo en los registros) y la línea que diceFile fetch completed. (que no veo).

Esto me dice que el bloqueo ocurre durante el sondeo / recuperación real de los archivos, lo que me apunta en la misma dirección queesta pregunt que pude encontrar lo que se refiere al bloqueo de FTPClient. Esto me hace preguntarme si estos son los mismos problemas si lo están, ¡felizmente borraré esta pregunta!). Sin embargo no creocree son iguales (no veo las mismas excepciones en mis registros).

Un compañero de trabajo mencionó que podría ser una cosa FTP "pasiva" versus "activa". Sin saber realmente la diferencia, estoy un poco confundido por los campos FTPClientACTIVE_REMOTE_DATA_CONNECTION_MODE, PASSIVE_REMOTE_DATA_CONNECTION_MODE, etc. y no sabía qué pensaba SO sobre eso como un problema potencial.

Desde que estoy atrapandoThrowables como último recurso aquí, hubiera esperado veralguna cos en los registros si algo va mal. Ergo, siento que este es un problema definitivo para colgar.

¿Algunas ideas? Lamentablemente, no sé lo suficiente acerca de los aspectos internos de FTP aquí para hacer un diagnóstico firme. ¿Podría ser esto algo del lado del servidor? ¿Relacionado con el servidor FTP?

Respuestas a la pregunta(8)

Su respuesta a la pregunta