Apache Commons FTPClient Hanging

Nous utilisons par la suite Apache Commons Net code FTP pour se connecter à un serveur FTP, sondage certains répertoires pour les fichiers, et si les fichiers sont trouvés, pour les récupérer à la machine locale:

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

Nous avons cette planifiée pour s'exécuter à chaque minute, la minute. Lors de son déploiement sur Tomcat (7.0.19) ce code charge jusqu'parfaitement bien et commence à travailler sans accroc. À chaque fois, même si, à un moment ou un autre, il semble tout simplement accrocher. Je veux dire par là:

  • Pas de tas de décharges existent
  • Tomcat est toujours en cours (je peux voir son pid et peut se connecter au gestionnaire web app)
  • À l'intérieur de l'application gestionnaire, je peux voir ma GUERRE est toujours en cours d'exécution/commencé
  • catalina.out et mon spécifiques à l'application journal ne montre pas de signes de toute exception levée

Si la JVM est toujours en cours d'exécution. Tomcat est toujours en cours d'exécution, et mon déployé la GUERRE est toujours en cours, mais juste que sa pendaison. Parfois, il fonctionne pendant 2 heures, puis se bloque; d'autres fois, il s'exécute pendant des jours et puis se bloque. Mais quand il ne raccrochez, il le fait entre la ligne qui lit About to check loadables/for files... (dont je ne voir dans les journaux) et la ligne qui lit File fetch completed. (dont je ne vois pas).

Cela me dit le blocage survient lors de l'interrogation/récupération des fichiers, le type de points de moi dans la même direction que cette question que j'ai pu trouver qui le concerne lui-même avec FTPClient de l'interblocage. Il me demandais si ce sont les mêmes questions (si elles le sont, je vais joyeusement supprimer cette question!). Cependant, je ne pense pas que croire ils sont les mêmes (je ne vois pas les mêmes exceptions dans mes logs).

Un collègue l'a mentionné, il pourrait être un "Passif" et "Actif" FTP chose. Ne sachant pas vraiment la différence, je suis un peu confus par la FTPClient champs ACTIVE_REMOTE_DATA_CONNECTION_MODEPASSIVE_REMOTE_DATA_CONNECTION_MODEetc. et je ne savais pas quoi DONC pensé que comme un problème potentiel.

Depuis que je suis attraper Throwables comme un dernier recours, ici, je me serais attendu à voir quelque chose dans les journaux, si quelque chose va mal. Ergo, j'ai l'impression que c'est un réel problème de blocage.

Des idées? Malheureusement, je ne sais pas assez sur FTP internals ici pour faire un diagnostic ferme. Cela pourrait-il être quelque chose côté serveur? Liées au serveur FTP?

source d'informationauteur IAmYourFaja