2009-09-27 5 views
0

J'utilise le code Java pour télécharger des fichiers en utilisant FTP. Quand je compile et exécute le code tout fonctionne parfaitement, mais si je le lance en tant que service Windows en utilisant Java Service Launcher, il ne se connecte pas du tout au serveur FTP (il fait juste le reste du travail, c'est déplacer des fichiers archiver le dossier). Btw, existe-t-il un meilleur moyen de tester la sortie du processus enfant que d'écrire son résultat dans un fichier, plutôt que d'analyser le contenu du fichier? Voici le code:Le code Java pour le téléchargement FTP ne fonctionne pas correctement si lancé en tant que service Windows

Runtime runtime = Runtime.getRuntime(); 
String[] cmd = {"c:\\ftp\\putskripta.bat"}; 
Process p1 = runtime.exec(cmd); 
p1.waitFor(); 


File izlaz = new File("C:\\ftp\\izlaz.txt"); 

int arrlen = 10000; 
byte[] infile = new byte[arrlen]; 

FileInputStream fis = new FileInputStream(izlaz); 
BufferedInputStream bis = new BufferedInputStream(fis); 
DataInputStream dis = new DataInputStream(bis); 

int filelength = dis.read(infile); 
String filestring = new String(infile, 0, 10000); 
CharSequence[] sekvenca = {"Invalid command", "Not connected"}; 

if (!filestring.contains(sekvenca[0]) && !filestring.contains(sekvenca[1])) 
{ 
      File uploads = new File("C:\\ftp\\Uploads"); 
      File[] uploadfiles = uploads.listFiles(); 
      int godina = java.util.Calendar.getInstance().get(java.util.Calendar.YEAR); 
      int mjesec = Calendar.getInstance().get(Calendar.MONTH)+1; 
      int dan = Calendar.getInstance().get(Calendar.DAY_OF_MONTH); 


      for (int i = 0; i < uploadfiles.length; i++) { 
       if (uploadfiles[i].getName().startsWith("ARTST") || uploadfiles[i].getName().startsWith("BESTE") || uploadfiles[i].getName().startsWith("LAGER") || uploadfiles[i].getName().startsWith("AVISE") || uploadfiles[i].getName().startsWith("KUNDE") || uploadfiles[i].getName().startsWith("BORDE") || uploadfiles[i].getName().startsWith("ENTLA")) { 
        File destinacijaFoldera = new File("C:\\ftp\\MovedUploads\\" + godina + "\\" + mjesec + "\\" + dan); 

        File destinacijaFajla = new File("C:\\ftp\\MovedUploads\\" + godina + "\\" + mjesec + "\\" + dan + "\\" + uploadfiles[i].getName()); 
        if (!destinacijaFoldera.isDirectory()) { 
         destinacijaFoldera.mkdirs(); 
        } 

       File temp = new File(destinacijaFoldera, uploadfiles[i].getName() + "_" + String.valueOf(Calendar.getInstance().get(Calendar.HOUR_OF_DAY)) + String.valueOf(Calendar.getInstance().get(Calendar.MINUTE)) + String.valueOf(Calendar.getInstance().get(Calendar.SECOND)));  
       if (!destinacijaFajla.exists()) { 
       uploadfiles[i].renameTo(destinacijaFajla); 
       } 
       else{ 
        uploadfiles[i].renameTo(temp); 
       } 

        uploadfiles[i].renameTo(new File(destinacijaFoldera, uploadfiles[i].getName())); 
       } 
      } 
     } 
else {izlaz.delete(); throw new Exception("Neuspio pokusaj uploada");} 
     izlaz.delete(); 

Juste au cas où, voici le code pour "putskripta.bat"

@echo off 
cd c:\ftp\Uploads 
ftp -s:c:\ftp\putkomande.txt -i localhost > c:\ftp\izlaz.txt 

Répondre

0

Par défaut, les services Windows fonctionnent sous le compte LocalSystem, qui ne dispose pas d'accès au réseau. Reconfigurez votre service pour utiliser un compte ayant accès à votre site FTP, tel que NetworkService, ou un compte que vous créez.

+0

Merci pour la réponse rapide: D Je n'utilise pas de code java pour me connecter au serveur ftp. Le code est dans le script batch. A côté de cela, j'ai créé un service de téléchargement supplémentaire à partir du serveur FTP, et cette application fonctionne bien comme un service. J'ai même essayé d'exécuter les 4 premières lignes de code seul (la partie de téléchargement) comme un service Windows et cela a fonctionné. Je suis assez confiant que le problème est dans le reste du code. Y a-t-il un problème avec les services Windows qui créent de nouveaux processus (im appelant le script batch comme un nouveau processus)? Cela pourrait-il être un problème? – Eedoh

0

Je n'ai pas de meilleure façon de récupérer les résultats du processus fils, mais j'ai réussi à utiliser ftp sans créer de processus fils. Le package Apache Commons Net contient des méthodes pour exécuter le protocole FTP à partir du programme Java.

+0

Merci beaucoup. J'ai essayé cette librairie et cela a très bien fonctionné dans mon environnement de test, maintenant j'ai un meilleur contrôle du processus. Cependant, j'ai des problèmes de connexion au serveur de production. Le serveur de ce client utilise l'ancien système d'exploitation OS/400. Il semble qu'il utilise une ancienne syntaxe et ne reconnaît pas les commandes standard (cela me permet seulement de me connecter). Avez-vous une expérience liée à cela? – Eedoh

+0

Je l'ai seulement utilisé contre les serveurs Windows et cela a bien fonctionné. Je vois dans le javadoc qu'il y a un configure qui prend un FTPClientConfig qui a des paramètres prédéfinis incluant SYST_OS400. Avez-vous essayé cela? – GregA100k

+0

Oui, je l'ai figuré, juste après que je t'ai posé la question: D. Vous avez été très utile, merci encore. Je suis vraiment désolé je ne peux pas voter pour votre réponse, parce que je suis débutant ici, et ne pas avoir la réputation de 15 :( – Eedoh

Questions connexes