J'essaye de traiter un certain répertoire FTP qui contient plusieurs répertoires et à leur tour, ces répertoires ont un nombre arbitraire de fichiers. Donc ce que je suis en train de faire est d'avoir 1 fil pour chacun des sous-répertoires et chaque thread à se préoccuper de la sous-dir ici est ce que je suis venu respectif:Téléchargement FTP multithread
private void fetchFilesFromFTP() {
try {
client.connect("ftp.ncbi.nih.gov");
client.login("anonymous", "anonymous");
client.changeWorkingDirectory("genomes/Fungi");
FTPFile dirs[] = client.listDirectories();
dirsToDl.addAndGet(dirs.length);
for (final FTPFile ftpFile : dirs) {
exec.execute(new Runnable() {
//process each FTP directory in a new thread
@Override
public void run() {
processFTPdir(ftpFile.getName());
}
});
}
} catch (SocketException ex) {
Logger.getLogger(FungiProcessor.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(FungiProcessor.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void processFTPdir(String dir) {
File f = new File(destination + File.separator + dir);
if (!f.mkdirs()) {
System.out.println("Error creating dir for " + dir);
return;
}
FTPFile files[];
try {
//we are already in the correct directory
files = client.listFiles(dir, new FTPFileFilter() {
@Override
public boolean accept(FTPFile ftpf) {
return ftpf.getName().endsWith(".gbk");
}
});
for (FTPFile fTPFile : files) {
FileOutputStream fout = new FileOutputStream(destination + File.separator + dir + File.separator + fTPFile.getName());
if (client.retrieveFile(dir + "/" + fTPFile.getName(), fout)) {
System.out.println("successfully downloaded");
fout.flush();
fout.close();
}
System.out.println(client.getReplyString());
}
} catch (IOException ex) {
Logger.getLogger(FungiProcessor.class.getName()).log(Level.SEVERE, null, ex);
} finally {
if(dirsToDl.decrementAndGet() == 0) latch.countDown();
}
}
La version séquentielle du code works - Je peux voir les fichiers se terminant par .gbk en cours de téléchargement alors qu'avec la version multithread, seuls les sous-répertoires respectifs sont créés mais aucun fichier n'est téléchargé. Je n'ai même pas d'erreurs. Est-il possible que FTP ne supporte pas plusieurs téléchargements de fichiers à la fois?
Mais chaque thread utilise la même connexion FTP ou ouvre une connexion distincte? – gd1
utilise la même connexion. C'est pourquoi j'ai dit que je ne l'ai pas fait maintenant si FTP en tant que protocole supportait ce – LordDoskias
Via les threads? J'en doute fortement. Tous les threads partageraient le même client (et donc le même canal de commande), et FTP ne fournit pas un moyen de faire le type de multiplexage dont vous auriez besoin pour le faire fonctionner. (Les réponses aux commandes de deux threads ressemblent à peu près au même: FTP ne peut pas dire "c'est une réponse à la commande 1".) – cHao