-
FTP; Jakarta Commons.net
Bonjour,
Je rencontre un problème en ce moment en utilisant la librairie "commons.net" et plus particulière les instances de "FTPClient".
Je pense que c'est un problème assez classique et que quelqu'un l'a déjà rencontré.
Sur FTP se trouve un répertoire ou un client peut déposer des fichiers. J'ai une application qui, toutes les 15 minutes, scrute le répertoire FTP pour copier dans un répertoire de travail local tous les fichiers du répertoire FTP.
Pour cela on utilise une instance "ftp" de la classe "FTPClient" pour pouvoir se connecter au serveur FTP puis on récupère un fichier désigné par un chemin 'ftpFicPath' grâce à la commande "res = ftp.retrieveFile(ftpFicPath, fos);" où "fos" est un FileOutputStream qui permet de réaliser la copie.
Cela fonctionne bien sauf si on essaye de transférer un fichier (sur le répertoire de travail local) qui est en cours d'écriture sur le serveur FTP.
Exemple : un client copie un fichier de 10 MO dans le répertoire du serveur FTP; la copie sur FTP n'étant pas terminée, mon programme Java scrute ce répertoire, il découvre ce nouveau fichier et commence le transfert sans que ce fichier soit intégralement copié dans le répertoire FTP. Dans ce cas le fichier n'est pas intégralement transféré dans le répertoire de travail et aucune erreur n'est retournée.
Je souhaiterais savoir comment détecter le fait que le fichier est en cours d'écriture sur le serveur FTP à l'aide de cette librairie. Je souhaite aussi éviter toute solution du genre : vérifier la taille du fichier à 5 secondes d'intervalle (si la taille est différente alors le fichier est en cours d'écriture) car si la taille du fichier est la même rien ne garantit que ce fichier n'a pas pu être complété durant ces 5 secondes sur le serveur FTP.
Merci
-
Je ne pense pas qu'on puisse le savoir...
Le plus simple serait de gérer une file d'attente de traitement. Dans ce cas de figure, la question ne se pose plus.
Ou alors, tu passes par un lock sur la fonctionalité (avec un méthode static et un bon vieux synchronize)
A+
-
Merci pour votre réponse mais vous pouvez préciser un peu plus ?
J'ai une personne extérieure qui dépose un fichier sur un site FTP par un quelconque client FTP. J'ai mon programme java avec une méthode statique du genre "recupererFichier()" et il suffirait que je la déclare en synchronyse pour que cela fonctione ?
A+
-
Si la méthode est "static", tu rajoutes le modificateur "synchronized" à ta méthode de transfert...
-
Bonjour,
En mettant un synchronized
synchronized private static boolean recupererFichierFTP(FTPClient ftp, FTPFile fichier, String repFTP, String repDES)
cela ne marche pas vraiment mieux...
En fait je pensais que les méthodes synchronized étaient utilisées pour synchroniser des appels de méthode sur un objet lorsque celui-ci était accédé
par plusieurs processus Java en même temps... Le fait de mettre "Synchronized" ne permet surement que de synchroniser les appels Java entre eux mais pas avec des processus externe comme un client FTP du style FileZilla ?
Merci
-
Bonjour,
Il semble effectivement qu'on ne puisse poser de verrou sur un fichier avec un client FTP (de toutes façons, il n'y a qu'à voir les commandes FTP disponibles).
De plus suivant les serveurs FTP, il est possible d'empêcher le téléchargement d'un fichier lorsque celui-ci est en cours d'écriture (FileZilla Server).
Cependant si on ne sait pas comment est configuré le serveur FTP, il suffit d'essayer de renommer le fichier FTP. Si le renommage fonctionne il n'est pas en écriture. Si le renommage est impossible c'est que le fichier est en écriture sur FTP et est donc locké en écriture.
Le mieux est de renommer le fichier avec le même nom (ce qui fonctionne sur certains serveurs FTP)...
Si vous trouvez mieux...
Merci
-
Tu pourrais comparer la taille d'un fichier sur un court délai et en déduire si le fichier est en upload.
-
Oui bien sur, mais le problème est toujours de définir de combien j'attends ? 10 secondes ? une minute ? est-ce suffisant s'il y a un encombrement réseau ou si la machine est saturée (trop de connexions à gérer en meme temps) ? Je préfère renommer le fichier (avec le même nom) car dans ce cas je suis sur que le fichier est complètement uploadé car si j'attends 10 secondes, même si la taille n'a pas évoluée, je n'en suis pas vraiment sûr...
Merci
-
Oui, t'as raison, si t'as les droits tente de le renommer, tu seras fixé en effet.
Sinon en regardant vite fait la rfc de ftp, il y a une commande STATUS qui donne entre autre l'"état de toutes les connexions". Peut être y-a-t-il suffisamment d'info : http://www.iprelax.fr/ftp/ftp_rfcfr4.php#4.1.1