Stiamo utilizzando il seguente codice di Apache Commons Net FTP per connettersi a un server FTP, il polling alcune directory per i file, e se vengono trovati i file, per recuperarli al computer locale:Apache Commons FTPClient Hanging
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());
}
Abbiamo programmato l'esecuzione ogni minuto, al minuto. Quando viene distribuito su Tomcat (7.0.19) questo codice viene caricato perfettamente e inizia a funzionare senza intoppi. Ogni volta però, ad un certo punto o in un altro, sembra solo hang. Con questo voglio dire:
- Nessun dump heap esistono
- Tomcat è ancora in esecuzione (che posso vedere il suo PID e può accedere al Web Manager app)
- All'interno il manager app, posso vedere il mio GUERRA è ancora in esecuzione/cominciato
catalina.out
e il mio spettacolo registro specifico per l'applicazione senza segni di eventuali eccezioni gettati
Quindi la JVM è ancora in esecuzione. Tomcat è ancora in esecuzione e il mio WAR distribuito è ancora in esecuzione, ma è appena sospeso. A volte funziona per 2 ore e poi si blocca; altre volte funziona per giorni e poi si blocca. Ma quando si blocca, lo fa tra la riga che legge About to check loadables/ for files...
(che vedo nei registri) e la riga che legge File fetch completed.
(che non vedo).
Questo mi dice che il blocco si verifica durante il polling/recupero effettivo dei file, che mi indica nella stessa direzione di this question che sono riuscito a trovare che riguarda se stesso con deadlock di FTPClient. Questo mi chiede se questi sono gli stessi problemi (se lo sono, eliminerò felicemente questa domanda!). Tuttavia non credo che creda che siano uguali (non vedo le stesse eccezioni nei miei registri).
Un collega ha affermato che potrebbe trattarsi di una cosa FTP "passiva" o "attiva". Non sapendo veramente la differenza, sono un po 'confuso dai campi FTPClient ACTIVE_REMOTE_DATA_CONNECTION_MODE
, PASSIVE_REMOTE_DATA_CONNECTION_MODE
, ecc. E non sapevo cosa ne pensasse SO come potenziale problema.
Dal momento che sto rilevando Throwable
s come ultima risorsa qui, mi sarei aspettato di vedere qualcosa di nei registri se qualcosa non funziona. Ergo, mi sembra che questo sia un vero problema.
Qualche idea? Sfortunatamente non conosco abbastanza gli interni FTP per fare una diagnosi precisa. Potrebbe essere qualcosa lato server? Relativo al server FTP?
L'unica cosa che potrebbe non avere senso con la mia risposta è il motivo per cui questo funziona a volte. – tjg184
Esattamente! E non solo * a volte * ... funziona circa il 99,9% delle volte! Ecco perché mi sento come questo è un problema lato server ... grazie per i suggerimenti, però proverò entrambi! – IAmYourFaja
Per curiosità, qual è la vera differenza tra passivo/attivo? La mia comprensione è che, sotto attivo, è il server che avvia la connessione. È questo il senso? – IAmYourFaja