IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web en Java Discussion :

Application Web - Mise en place de CRON


Sujet :

Développement Web en Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur et passionné
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur et passionné

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Points : 28
    Points
    28
    Par défaut Application Web - Mise en place de CRON
    Bonjour à tous,

    Toujours dans mon projet d'application web en JEE, me voilà à nouveau face à des notions que je n'arrive pas à élucider complètement.
    En effet, cette appli est destinée à des utilisateurs. Ces utilisateurs recevront, à fréquence régulière, des rappels par mail s'ils n'ont pas remplis certaines tâches.

    De plus, chaque utilisateur pourra régler, dans ses paramètres de config, la fréquence de relance.

    En cherchant un peu, j'ai vu que j'aurais certainement besoin d'utiliser l'API Quartz, dont j'ai trouvé le tuto ici, mais je n'ai pas bien compris la théorie du fonctionnement de cette API.

    Comment l'implémenter dans mon appli pour qu'elle tourne en tâche de fond toujours (et pas seulement lorsqu'un utilisateur s'y connecte) et que le comportement soit différent en fonction des paramètres entrés par chaque utilisateur ?

    Merci d'avance

    Guillaume

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur et passionné
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur et passionné

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Points : 28
    Points
    28
    Par défaut
    Personne ?
    J'ai essayé de suivre le tuto, mais le code est très peu expliqué et ne fonctionne pas...
    Au final, je ne comprends toujours pas comment mettre en place des fréquences de relance différentes pour chaque utilisateur.
    Dois-je faire un job différent pour chaque user ? Ou simplement des triggers différents ?

  3. #3
    Membre régulier Avatar de juridakus
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 82
    Points : 115
    Points
    115
    Par défaut
    Quartz permet de définir des jobs ou taches, de les persister ainsi que leur planification.
    Donc pour les mettre en place tu as besoin de définir en général une source de données où seront persister les jobs, et pour l'exécution une classe qui implémentera la méthode execute de l'interface org.Quartz.job. Cette méthode déclenchera un job à chaque fois que l'évaluation de l'expression cron de plannification de ce dernier arrivera à terme.
    Cette librairie s'intègre avec Spring, ce qui facilite l'injection d'autres services. Les jobs sont généralement groupés par fonctionnalités, un job par utilisateur je ne pense pas que ce soit l'approche optimale. tu peux grouper tes utilisateurs par rôle et à l'intérieur de ton service faire une fonction mail classique qui enverra des mails si les conditions voulues sont vérifiées.
    Espérant que cela vous aide.
    Don't worry, be happy

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur et passionné
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur et passionné

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Points : 28
    Points
    28
    Par défaut
    Merci Juridakus,

    Oui ton commentaire m'est très utile car il me permet de visualiser un peu mieux le fonctionnement de cette API, et son intégration possible dans une appli web.
    De plus, cela rejoint un peu mon raisonnement initial donc ça me rassure un peu !
    Admettons que ma table utilisateur soit composée des champs suivants :

    table Utilisateur
    IDUtilisateur | frequence_relance1 | frequence_relance2 |

    Donc rajouter les champs : | jours_restants_avant_relance1 | jours_restants_avant_relance2 , n'est pas une mauvaise idée ?

    Ensuite, Quartz appelle un Job qui chaque jour, vérifie si la relance a été faite, et sinon, il décrémente les compteurs pour chaque utilisateur. Si le compteur arrive à 0, on fait l'action définie (envoi du mail).

    Cette solution n'est pas absurde, pas trop "sale" ?
    Quartz permet surement de faire des Job déclenchés par des Triggers différents, mais je doute d'avoir le temps de mettre cela en place avant la fin de mon projet...

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Votre approche avec mise à jour des compteurs fonctionne dans le cas optimal, mais elle est sensible à des incidents (si pour une raison imprévue le job ne part pas pendent un jour ou plus, tout sera faussé). Personnellement, je stockerais plutôt la date de la dernière relance (initialisée à la date à partir de laquelle la tâche aurait dû être accomplie), et je ferais vérifier par le job combien de jours se sont écoulés depuis cette date =>si >nb_jour_entre_relance, on envoie le mail. De cette façon en cas de reprise après une interruption des jobs toutes les relances en retard partiront (en plus de celles du jour).

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur et passionné
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur et passionné

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Points : 28
    Points
    28
    Par défaut
    Merci !
    C'est en effet sur un stockage de date de la dernière relance que je suis parti.
    Du coup, pour info, voici des petits bouts de code :
    L'extrait du web.xml permettant d'initialiser une servlet au démarrage :
    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
    <servlet>
        <description></description>
        <display-name>MyScheduler</display-name>
        <servlet-name>MyScheduler</servlet-name>
        <servlet-class>servlet.scheduler.MyScheduler</servlet-class>
       	<init-param>
       		<param-name>config-file</param-name>
       		<param-value>../quartz.properties</param-value>
       	</init-param>
       	<init-param>
       		<param-name>shutdown-on-unload</param-name>
       		<param-value>true</param-value>
       	</init-param>
       	<init-param>
       		<param-name>start-scheduler-on-load</param-name>
       		<param-value>true</param-value>
       	</init-param>
       <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>MyScheduler</servlet-name>
        <url-pattern>/MyScheduler</url-pattern>
      </servlet-mapping>
    La servlet MyScheduler :
    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
     
    public class MyScheduler extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	private boolean performShutdown;
        private Scheduler scheduler;
    	Calendar cal = Calendar.getInstance();
     
    	public MyScheduler() {
    		performShutdown = true;
            scheduler = null;
        }
    public void init(ServletConfig cfg) throws ServletException{
    		super.init(cfg);
    String configFile = cfg.getInitParameter("config-file");
                String shutdownPref = cfg.getInitParameter("shutdown-on-unload");
                if(shutdownPref != null)
                {
                    performShutdown = Boolean.valueOf(shutdownPref).booleanValue();
                }
                StdSchedulerFactory factory;
                if(configFile != null){
                	factory = new StdSchedulerFactory(configFile);
                }
                else{
                	factory = new StdSchedulerFactory();
                }
                scheduler = factory.getScheduler();
                String startOnLoad = cfg.getInitParameter("start-scheduler-on-load");
                if(startOnLoad == null || Boolean.valueOf(startOnLoad).booleanValue()){
                	if(scheduler.isStarted()){
                		System.err.println("~~~~~~~~~~~~~~~~~~This is the Alarm message Scheduler Already started~~~~~~~~~~~~~~~~~~~``");
                	}
                	scheduler.start();
                	System.out.println("TriggerMail Started  for 3 and 3.15");
                }
                else{
                	System.err.println("Scheduler has not been started. Use scheduler.start()");
                }
                String factoryKey = cfg.getInitParameter("servlet-context-factory-key");
                if(factoryKey == null){
                	factoryKey = "org.quartz.impl.StdSchedulerFactory.KEY";
                }
                System.err.println("Storing the Quartz Scheduler Factory in the servlet context at key: " + factoryKey);
                cfg.getServletContext().setAttribute(factoryKey, factory);
     
     
     
     
                // On definit un Job : il se reveillera chaque nuit pour executer differentes action
                JobDetail job = newJob(VerificationJob.class)
                    .withIdentity("myJob", "group1")
                    .build();
     
                //On definit le trigger de ce job, qui permet un declenchement infini, et, pour l'instant, a un intervalle de 20s
                Trigger trigger=newTrigger()
                		.withIdentity("myTrigger","group1")
                		.startNow()
                		.withSchedule(simpleSchedule()
                		          .withIntervalInSeconds(60)
                		          .repeatForever())            
                		.build();
     
                scheduler.scheduleJob(job,trigger);
     
    		}catch(Exception ex){
    			System.out.println("Quartz Scheduler failed to initialize: " + ex.toString());
                throw new ServletException(ex);
    		}
     
    	}
    Et le job en lui meme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class VerificationJob implements Job{
    	private static Connection cnx;
    	public VerificationJob(){
    		//Constructeur vide 
    	}
     
    	public void execute(JobExecutionContext arg0) throws JobExecutionException {
    		//		JobDataMap data = arg0.getMergedJobDataMap();
    		//        System.out.println("someProp = " + data.getString("someProp"));
    		System.err.println("Execution du Job");
    }
    }
    Encore merci pour votre aide !

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

Discussions similaires

  1. Application de mise en place CMMI (JEE)
    Par heirow dans le forum ALM
    Réponses: 4
    Dernier message: 11/02/2012, 10h04
  2. Application de mise en place CMMI (JEE)
    Par heirow dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 02/02/2012, 12h30
  3. Réponses: 1
    Dernier message: 19/09/2011, 22h56
  4. Réponses: 3
    Dernier message: 31/10/2007, 11h38
  5. [ Microsoft Expression Web] Mise en place de code
    Par beletteroi dans le forum Autres Logiciels
    Réponses: 0
    Dernier message: 29/07/2007, 12h13

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