1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    août 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : août 2017
    Messages : 16
    Points : 13
    Points
    13

    Par défaut [Quartz] Utilisation du Cron Schedule pour une connexion FTP en Java

    Bonjour,

    Je me permet de poster car j'ai un soucis et peut-être que vous pourrez m'aider !
    Pour un projet, on m'a demander d'établir une connection FTP en Java afin de download des fichiers (Pour cela il n'y a pas de problème). On m'a demandé que le programme récupère toutes les heures fichiers (car ils subiront une modification régulière). J'ai donc pour cela décié d'utiliser Quartz et plus particulièrement Cron Schedule.
    Le problème est donc le tout ensemble. Je vous montre mon code pour que vous puissiez voir (je pense que j'utilise mal mon Job mais comme je ne connais pas du tout cette API j'ai du mal à comprendre)

    Quartz.java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    package com.auscult.ftp;
    import java.io.IOException;
    import java.util.TimeZone;
    import org.quartz.CronScheduleBuilder;
    import org.quartz.JobBuilder;
    import org.quartz.JobDetail;
    import org.quartz.Scheduler;
    import org.quartz.SchedulerException;
    import org.quartz.SchedulerFactory;
    import org.quartz.Trigger;
    import org.quartz.TriggerBuilder;
    import org.quartz.impl.StdSchedulerFactory;
     
    public class Quartz {
     public static void main(final String[] args) {
         final SchedulerFactory factory = new StdSchedulerFactory();
         Scheduler scheduler = null;
         try {
           scheduler = factory.getScheduler();
           final JobDetail jobDetail = JobBuilder
               .newJob(FTPFunctions.class)
               .withIdentity("monJob", "groupe_1" )
               .usingJobData("monParametre", "12345" )
               .build();
           final Trigger cronTrigger = TriggerBuilder
               .newTrigger()
               .withIdentity("monTrigger", "groupe_1" )
               .withSchedule(
                   CronScheduleBuilder.cronSchedule("0 0/1 * * * ?" ) //Interval de 1mn afin de faire des test)
                     .inTimeZone(TimeZone.getTimeZone("Europe/Paris" )))
               .build();
           scheduler.start();
           scheduler.scheduleJob(jobDetail, cronTrigger);
           System.in.read();
           if (scheduler != null) {
             scheduler.shutdown();
           }
         } catch (final SchedulerException e) {
           e.printStackTrace();
         } catch (final IOException e) {
           e.printStackTrace();
         }
       }
    }

    FTPFunctions.java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    package com.auscult.ftp;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import org.apache.commons.net.PrintCommandListener;
    import org.apache.commons.net.ftp.FTP;
    import org.apache.commons.net.ftp.FTPClient;
    import org.apache.commons.net.ftp.FTPFile;
    import org.apache.commons.net.ftp.FTPReply;
    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
     
    public class FTPFunctions implements Job {
     
    private String host;
    private String username;
    private String password;
    private int port;
    private static String remoteFilePath;
    private static String savePath;
    private static String parentDir;
    private static String currentDir;
    private static String saveDir;
    private static FTPClient ftpClient = new FTPClient();
     
     public FTPFunctions(String server, int pPort, String pUsername, String pPassword) throws Exception {
     	host = server;
     	port = pPort;
     	username = pUsername;
     	password = pPassword;
     	ftpClient.addProtocolCommandListener (new PrintCommandListener(new PrintWriter(System.out)));
            int reply;
            ftpClient.connect( host , port);
            System.out.println("FTP URL is:"+ftpClient.getDefaultPort());
            reply = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();
                throw new Exception("Exception in connecting to FTP Server" );
            }
            ftpClient.login(username, password);
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            ftpClient.enterLocalPassiveMode();     
     
     }
     
     public static boolean downloadFTPFile(FTPClient ftpClient, String RemoteFilePath, String SavePath) throws IOException {
     	remoteFilePath  = RemoteFilePath;
     	savePath    = SavePath;
     	File downloadFile = new File(savePath);
     
         File parentDir = downloadFile.getParentFile();
         if (!parentDir.exists()) {
             parentDir.mkdir();
         }
     
         OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(downloadFile));
     
         try {
     
             ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
             return ftpClient.retrieveFile(remoteFilePath, outputStream);
         } catch (IOException ex) {
             throw ex;
         } finally {
             if (outputStream != null) {
                 outputStream.close();
             }
         }
        }
     
     public static void downloadDirectory(FTPClient ftpClient, String ParentDir, String CurrentDir, String SaveDir) throws IOException {
     	parentDir  = ParentDir;
     	currentDir = CurrentDir;
     	saveDir    = SaveDir;
         String dirToList = parentDir;
         if (!currentDir.equals("" )) {
             dirToList += "/" + currentDir;
         }
         FTPFile[] subFiles = ftpClient.listFiles(dirToList);
         if (subFiles != null && subFiles.length > 0) {
             for (FTPFile aFile : subFiles) {
                 String currentFileName = aFile.getName();
                 if (currentFileName.equals("." ) || currentFileName.equals(".." )) {
                     continue;
                 }
                 String filePath = parentDir + "/" + currentDir + "/"
                         + currentFileName;
                 if (currentDir.equals("" )) {
                     filePath = parentDir + "/" + currentFileName;
                 }
                 String newDirPath = saveDir + parentDir + File.separator + currentDir + File.separator + currentFileName;
                 if (currentDir.equals("" )) {
                     newDirPath = saveDir + parentDir + File.separator
                               + currentFileName;
                 }
                 if (aFile.isDirectory()) {
                     File newDir = new File(newDirPath);
                     boolean created = newDir.mkdirs();
                     if (created) {
                         System.out.println("CREATED the directory: " + newDirPath);
                     } else {
                         System.out.println("COULD NOT create the directory: " + newDirPath);
                     }
                     downloadDirectory(ftpClient, dirToList, currentFileName, saveDir);
                 } else {
                     boolean success = downloadFTPFile(ftpClient, filePath, newDirPath);
                     if (success) {
                         System.out.println("DOWNLOADED the file: " + filePath);
                     } else {
                         System.out.println("COULD NOT download the file: " + filePath);
                     }
                 }
             }
         }
     }
     
     public void disconnect(){
            if (FTPFunctions.ftpClient.isConnected()) {
                 try {
                     FTPFunctions.ftpClient.logout();
                     FTPFunctions.ftpClient.disconnect();
                 } catch (IOException f) {
                 }
             }
        }
     
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
                    System.out.println("FTP execut" );
     	try {
       FTPFunctions ftp = new FTPFunctions("Test", 21, "killkala", "test" );
       String remoteDirPath = "/Station1";
                String saveDirPath = "//192.168.7.191/web/FTP";
     
                FTPFunctions.downloadDirectory(ftpClient, remoteDirPath, "", saveDirPath);
       System.out.println("FTP File downloaded successfully" );
       ftp.disconnect();
        } catch (Exception e) {
         e.printStackTrace();
        }     	 
    }
    }
    Je pense que mon Job n'aime pas trop toutes mes fonctions privées & public plus haut. En faite le problème c'est que je n'ai aucune erreur, juste rien ne se passe dans ma console. J'ai fais des test dépendant pour essayer de comprendre et c'est pour cela que j'en suis arrivé à la conclusion que l'association de mon Job à ma classe FTPFunctions n'a pas été concluante !
    Je pense que ca dois être une erreur trop bete, mais j'ai pas encore assez de connaissances pour savoir !
    Donc si jamais vous avez un peu de temps pour m'aider, ca serai avec grand plaisir !!!

    Merci d'avance pour vos réponses !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 399
    Points : 24 951
    Points
    24 951
    Billets dans le blog
    2

    Par défaut

    Salut,

    Je pense qu'il y a déjà un souci avec le fait que ta classe FTPFunctions n'ait pas de constructeur sans paramètre et donc Quartz ne sait pas comment l'instancier. C'est surprenant que tu n'aies pas d'erreur.

    Tu pourrais simplement faire un petit handler de job à part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class FTPJob implements Job {
     
         public void execute(JobExecutionContext context) throws JobExecutionException {
     
                  try {
       FTPFunctions ftp = new FTPFunctions("Test", 21, "killkala", "test" );
       String remoteDirPath = "/Station1";
                String saveDirPath = "//192.168.7.191/web/FTP";
     
                FTPFunctions.downloadDirectory(FTPFunctions.ftpClient, remoteDirPath, "", saveDirPath);
       System.out.println("FTP File downloaded successfully" );
       ftp.disconnect();
        } catch (Exception e) {
                throw new JobExecutionException(e/*refire immediately: ici tu peux ajouter un paramètre booléen qui permet de relancer le job immédiatement en cas d'exception - voir la doc pour plus de détails http://www.quartz-scheduler.org/documentation/quartz-2.x/examples/Example6.html )); // il vaut mieux renvoyer les exceptions vers le gestionnaire de job (ce qui permet de bénéficier de tous le support de cron schedule associé)
        }     	 
     
     
     
    }
    Tu peux rendre paramétrable ton job en utilisant (utiliser les paramètres que tu passes au scheduler par usingJobData(nom,valeur)).

    Pour récupérer les paramètres : JobDataMap data = context.getJobDetail().getJobDataMap();et par exemple, pour récupérer un paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String username = data.getString("username");
    (donc en ayant fait .usingJobData("username", "killkala") dans le code de scheduling

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    final JobDetail jobDetail = JobBuilder
               .newJob(FTPJob.class)
               .withIdentity("monJob", "groupe_1" )
               .usingJobData("username", "killkala")
               .usingJobData( un autre paramètre... autant qu'il faut )
               .build();

    En revanche ta classe FTPFunction n'est pas bien concue. Elle a une variable statique entre autre (ftpClient de type FTPClient) qui est initialisée dans le constructeur. Une variable statique est partagée entre toutes les instances de la classe. A chaque instanciation du job, chaque job va modifier cette variable entre autres comme elle pourrait être en train d'être utilisée par un autre job, ça risque de foutre le dawa. Supprime tous les mots clefs "static" dans cette classe, rend la variable ftpclient private, supprime-la de la liste des paramètres de méthode (c'est un attribut de la classe, chaque instance a la sienne et utilise la sienne). Ajoute juste une méthode disconnect() dans FTPFunctions pour faire la déconnexion (sans avoir à accèder à l'attribut ftpClient de l'extérieur), voire mieux, rend ta classe AutoClosable, et utilise un try-with-resource (surtout que dans ton code, disconnect n'est pas appelée en cas d'exception).

    Ainsi le code de execute deviendra si


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public class FTPJob implements Job {
     
         public void execute(JobExecutionContext context) throws JobExecutionException {
     
            try (   FTPFunctions ftp = new FTPFunctions("Test", 21, "killkala", "test" )) {
                String remoteDirPath = "/Station1";
                String saveDirPath = "//192.168.7.191/web/FTP";
     
                ftp.downloadDirectory(remoteDirPath, "", saveDirPath);
                System.out.println("FTP File downloaded successfully" );
        } catch (Exception e) {
                throw new JobExecutionException(e/*refire immediately: ici tu peux ajouter un paramètre booléen qui permet de relancer le job immédiatement en cas d'exception - voir la doc pour plus de détails http://www.quartz-scheduler.org/documentation/quartz-2.x/examples/Example6.html )); // il vaut mieux renvoyer les exceptions vers le gestionnaire de job (ce qui permet de bénéficier de tous le support de cron schedule associé)
        }     	 
     
     
    }
    A part ça, la plupart de tes variables static (qui devraient devenir des attributs donc) ne servent pas à grand chose, puisqu'elles ne sont qu'utilisées dans la méthode à laquelle leur valeur sont passées en paramètre : inutile donc de les stocker. Autant utiliser directement le paramètre.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    août 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : août 2017
    Messages : 16
    Points : 13
    Points
    13

    Par défaut

    Bonjour Joel,

    Je te remercie beaucoup de ta réponse. Tu m'as beaucoup débloqué.
    J'ai suivis tes conseils. J'ai fais un handler de Job à part. J'ai également enlevé tous mes "statics" et supprimé ftpClient des paramètres de méthodes. Cela fonctionne très bien, la connexion et le download s'effectue bien toutes les minutes ! J'ai rendu ma classe FTPFonctions AutoCloseable. Et pour finir j'ai réussis à rendre paramétrable mon Job.

    Je post mon code, si tu peux me donner ton avis et aussi pour d'autres personnes qui aurait un projet similaire, si ça peut les aider


    FTPFunctions.java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
     
    package com.auscult.ftp;
     
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.PrintWriter;
     
    import org.apache.commons.net.PrintCommandListener;
    import org.apache.commons.net.ftp.FTP;
    import org.apache.commons.net.ftp.FTPClient;
    import org.apache.commons.net.ftp.FTPFile;
    import org.apache.commons.net.ftp.FTPReply;
     
    import java.lang.AutoCloseable;
     
     
    public class FTPFunctions implements AutoCloseable {
     
    	private String host;
    	private String username;
    	private String password;
    	private int port;
     
    	private String remoteFilePath;
    	private String savePath;
     
    	private String parentDir;
    	private String currentDir;
    	private String saveDir;
     
    	private FTPClient ftpClient = new FTPClient();
     
     	public FTPFunctions(String server, int pPort, String pUsername, String pPassword) throws Exception {
     
     		host = server;
     		port = pPort;
     		username = pUsername;
     		password = pPassword;
     
     
     		ftpClient.addProtocolCommandListener (new PrintCommandListener(new PrintWriter(System.out)));
            int reply;
            ftpClient.connect( host , port);
            System.out.println("FTP URL is:"+ftpClient.getDefaultPort());
            reply = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();
                throw new Exception("Exception in connecting to FTP Server");
            }
            ftpClient.login(username, password);
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            ftpClient.enterLocalPassiveMode();       
     
     	}
     
     	public boolean downloadFTPFile(String RemoteFilePath, String SavePath) throws Exception {
     
     		remoteFilePath  = RemoteFilePath;
     		savePath 	 	= SavePath;
     
     
     		File downloadFile = new File(savePath);
     
     	    File parentDir = downloadFile.getParentFile();
     	    if (!parentDir.exists()) {
     	        parentDir.mkdir();
     	    }
     
     	    OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(downloadFile));
     
     	    try {
     
     	        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
     	        return ftpClient.retrieveFile(remoteFilePath, outputStream);
     	    } catch (IOException ex) {
     	        throw ex;
     	    } finally {
     	        if (outputStream != null) {
     	            outputStream.close();
     	        }
     	    }
        }
     
     	public void downloadDirectory(String ParentDir, String CurrentDir, String SaveDir) throws Exception {
     
     		parentDir  = ParentDir;
     		currentDir = CurrentDir;
     		saveDir    = SaveDir;
     
     	    String dirToList = parentDir;
     	    if (!currentDir.equals("")) {
     	        dirToList += "/" + currentDir;
     	    }
     
     	    FTPFile[] subFiles = ftpClient.listFiles(dirToList);
     
     	    if (subFiles != null && subFiles.length > 0) {
     	        for (FTPFile aFile : subFiles) {
     	            String currentFileName = aFile.getName();
     	            if (currentFileName.equals(".") || currentFileName.equals("..")) {
     	                continue;
     	            }
     	            String filePath = parentDir + "/" + currentDir + "/"
     	                    + currentFileName;
     	            if (currentDir.equals("")) {
     	                filePath = parentDir + "/" + currentFileName;
     	            }
     
     	            String newDirPath = saveDir + parentDir + File.separator + currentDir + File.separator + currentFileName;
     	            if (currentDir.equals("")) {
     	                newDirPath = saveDir + parentDir + File.separator
     	                          + currentFileName;
     	            }
     
     	            if (aFile.isDirectory()) {
     	                File newDir = new File(newDirPath);
     	                boolean created = newDir.mkdirs();
     	                if (created) {
     	                    System.out.println("CREATED the directory: " + newDirPath);
     	                } else {
     	                    System.out.println("COULD NOT create the directory: " + newDirPath);
     	                }
     
     	                downloadDirectory(dirToList, currentFileName, saveDir);
     	            } else {
     	                boolean success = downloadFTPFile(filePath, newDirPath);
     	                if (success) {
     	                    System.out.println("DOWNLOADED the file: " + filePath);
     	                } else {
     	                    System.out.println("COULD NOT download the file: " + filePath);
     	                }
     	            }
     	        }
     	    }
     	}
     
    	@Override
    	public void close() throws Exception {
     
    	}
     
    }

    FTPJob.java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    package com.auscult.ftp;
     
    import org.quartz.Job;
    import org.quartz.JobDataMap;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
     
    import com.auscult.ftp.FTPFunctions;
     
    public class FTPJob implements Job {
     
     
    	public void execute(JobExecutionContext context) throws JobExecutionException {	
     
    		JobDataMap data = context.getJobDetail().getJobDataMap();
     
    		String host = data.getString("host");
    		String username = data.getString("username");
    		String password = data.getString("password");
     
     		try (FTPFunctions ftp = new FTPFunctions(host, 21, username, password))
     		{
     			String remoteDirPath = data.getString("remoteDirPath");
                            String saveDirPath = data.getString("saveDirPath");
     
                            ftp.downloadDirectory(remoteDirPath, "", saveDirPath);
     
     			System.out.println("FTP File downloaded successfully");
    	    } catch (Exception e) {
    	    	throw new JobExecutionException(e);
    	    } 
     
    	}
     
    }

    Quartz.java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    package com.auscult.ftp;
     
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
     
    import org.quartz.CronScheduleBuilder;
    import org.quartz.JobBuilder;
    import org.quartz.JobDetail;
    import org.quartz.Scheduler;
    import org.quartz.SchedulerException;
    import org.quartz.Trigger;
    import org.quartz.TriggerBuilder;
    import org.quartz.impl.StdSchedulerFactory;
     
     
    public class Quartz implements ServletContextListener {
    	Scheduler scheduler = null;
     
    	@Override
        public void contextInitialized(ServletContextEvent servletContext) {
                System.out.println("Context Initialized");
     
                try {
                	final JobDetail job = JobBuilder
             	           .newJob(FTPJob.class)
             	           .withIdentity("monJob"  , "groupe_1" )
             	           .usingJobData("host"    , "ftp.test.fr")
             	           .usingJobData("username", "killkala")
             	           .usingJobData("password", "test")
             	           .usingJobData("remoteDirPath" , "/Station1")
             	           .usingJobData("saveDirPath"  , "//192.168.7.192/web/FTP/")
             	           .build();
     
    	             // Create a Trigger that fires every 1 minutes.
    	             final Trigger trigger = (Trigger) TriggerBuilder
    	             		.newTrigger()
    			                .withIdentity("TriggerName", "Group")
    			                .withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * * * ?")) 
    			                .build();
     
    	              // Setup the Job and Trigger with Scheduler & schedule jobs
    	              scheduler = new StdSchedulerFactory().getScheduler();
    	              scheduler.start();
    	              scheduler.scheduleJob(job, trigger);
            }
            catch (SchedulerException e) {
                    e.printStackTrace();
            }
    	}
     
    	@Override
        public void contextDestroyed(ServletContextEvent servletContext) {
                System.out.println("Context Destroyed");
                try 
                {
                        scheduler.shutdown();
                } 
                catch (SchedulerException e) 
                {
                        e.printStackTrace();
                }
        }
     
    }

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 399
    Points : 24 951
    Points
    24 951
    Billets dans le blog
    2

    Par défaut

    Déjà, il te manque dans la fermeture du client FTP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Override
    public void close() throws Exception {
        ftpClient.disconnect();
    }
    On peut spécialiser les erreurs en faisant throws IOException au lieu de throw Exception (toutes les méthodes).

    Tu peux supprimer toutes les variables de classe, sauf ftpClient. Les paramètres sont utilisables directement. Par exemple pour le constructeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public FTPFunctions(String host, int port, String username, String password) throws Exception {
     
     
    		ftpClient.addProtocolCommandListener (new PrintCommandListener(new PrintWriter(System.out)));
           int reply;
           ftpClient.connect( host , port);
           System.out.println("FTP URL is:"+ftpClient.getDefaultPort());
           reply = ftpClient.getReplyCode();
           if (!FTPReply.isPositiveCompletion(reply)) {
               ftpClient.disconnect();
               throw new Exception("Exception in connecting to FTP Server");
           }
           ftpClient.login(username, password);
           ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
           ftpClient.enterLocalPassiveMode();       
     
    	}
    Attention lorsque tu forces le type à binaire quelque soit le format de fichier : avec certains fichiers de format texte, le mode texte permet une conversion des retour-chariots qui peuvent avoir leur intérêt.


    Par ailleurs, tu devrais pouvoir simplifier (et de te passer de variables supplémentaires superfétatoires : toute variable supplémentaire est une source d'erreur supplémentaire, lorsqu'elle inutile, vaut mieux s'en passer) tous tes traitements de chemin de fichier.
    1. File file = new File( dir, name ) est plus simple et préférable à
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      String filename = dir; 
      if ( !dir.endsWith(File.separator) ) {
          dir+=File.separator;
      }
      file +=name;
      encore préférable à
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      String filename = dir; 
      if ( !dir.endsWith("/")&&!dir.endsWith("\\" ) {
          dir+="/";
      }
      file +=name;
      Pour les files FTP, à priori, le séparateur est toujours /, ça simplifie.
      FilenameUtils de Apache Common peut aussi t'aider à simplifier tout ça.
    2. L'API nio2 peut t'aider également à simplifier, avec Paths.getPath(...) et la classe Files.
    3. Le try-with-resource t'aidera également à simplifier :

      A la fin de ta méthode downloadFTPFile, on peut écrire tout simplement (à la place de ton try/catch) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
       
      	    try (OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(downloadFile))) {
       
      	        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
      	        return ftpClient.retrieveFile(remoteFilePath, outputStream);
      	    }
      Pas besoin de catcher une exception pour la relancer juste après (même s'il y a un bloc finally , il sera exécuté). Par de finally avec un appel explicite de close (grâce au try-with-resource et l'AutoCloseable).
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    août 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : août 2017
    Messages : 16
    Points : 13
    Points
    13

    Par défaut

    D'accord, je te remercie Joel pour tous tes conseils et ton aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/01/2015, 14h51
  2. Réponses: 4
    Dernier message: 12/04/2011, 11h38
  3. API à utiliser pour une connexion wi-fi
    Par ilhamita dans le forum IO
    Réponses: 1
    Dernier message: 23/02/2007, 11h04
  4. Configurer MYSQL++ avec Dev-C++ pour une connexion à BDMySQL
    Par limouna dans le forum Installation
    Réponses: 1
    Dernier message: 24/07/2005, 22h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo