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

Java Discussion :

Timer et Timetask (heure d'exécution recule tous les jours)


Sujet :

Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Timer et Timetask (heure d'exécution recule tous les jours)
    Bonjour à tous!

    Je commence par vous souhaiter une tres bonne fête demain!

    Chose sérieuse maintenant

    J'ai fait un petit programme qui doit s’exécuter tous les jours à une heure précise.
    Le programme s’exécute bien en tache planifiée, mais l'heure d’exécution recule tous les jours. Si vous pouviez me dire s'il y a un souci dans mon algorithme ou dans la manière dont j'ai implémenté le Timer.

    Voici l'architecture de celui-ci.

    Classe ProcessXXXX (qui fait le traitement) etend TimeTask;

    Classe ScheduleIT (qui fait implemente la tache planifiée) etend Timer, dans celle ci voici le contenu:

    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
     
       {
          (...)
          Timer t=new Timer();
          Calendar begin=Calendar.getInstance();
          Calendar ev=Calendar.getInstance();
          //ce teste permet de pouvoir relancer l'application 
         // le traitement doit demarrer tous les jours à 7h (du matin)
          if(begin.HOUR!=7){
           //on met la date de ev à j+1
                ev.add(Calendar.DATE,1)
           //on lance le traitement sur le moment present
                t.schedule(new ProcessXXXX, begin);
          //puis on met en attente jusqu'au jour suivant, puis lorsqu'il xecute         //il attend 23h avant de se relancer
                t.schedule(new ProcessXXXX,ev,82800000);
          }else{
                t.schedule(new ProcessXXXX, begin, 82800000);
          }
     
      }
    Merci d'avance.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Aucune piste ?

  3. #3
    Membre averti
    Homme Profil pro
    Java
    Inscrit en
    Mai 2011
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 170
    Points : 444
    Points
    444
    Par défaut
    Il faudrait poster du code car avec seulement 9 lignes dont la couche la plus haute du problème ne sont pas utile.

  4. #4
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 705
    Points : 4 783
    Points
    4 783
    Par défaut
    Si tu n'es pas encore au courant, il y a 24 heures dans un jour (et non pas 23)
    en millièmes de seconde : 24 * 60 *60 * 1000 = 86400000
    de sorte qu'il faut mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    t.schedule(new ProcessXXXX,ev,86400000);
    }else{
    t.schedule(new ProcessXXXX, begin, 86400000)
    par ailleurs
    - la documentation spécifie qu'on utilise un objet Date et non un Calendar
    - il me semble probable que tu auras un décalage d'une heure aux changements d'heure annuels (mars et octobre)


    @kinaesthesia : La classe Timer lance une tâche quelconque à intervalle régulier.
    Le problème vient du décalage de lancement pas de la tâche.
    On n'a pas besoin de savoir ce que fait cette tâche.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Ah oui, je viens de me rendre compte de ma "grosse bêtise" concernant le nombre d'heure d'attente.
    Par ailleurs, pour l'utilisation du Calendar, certes il peut y avoir un decalage avec les changements d'heures (ou autres), mais ce que je ne comprends pas c'est qu'en l'intervalle d'une semaine (i e la tâche a ete démarrée la semaine du 16 decembre et durant toute celle ci, l'heure se decaler d'1, alors qu'il n y a eu aucun evenement dans le calendrier).
    Je suspecte un peu que j'utilise mal l'implementation horaire de la tâche.
    Je vais modifier pour suivre le conseil, utiliser une Date au lieu d'un Calendar.
    Je reviendrai faire un post samedi, pour vous dire si cela a changé quelque chose.

    (discussion en stand by).

    Et Meilleurs voeux à tous!!

  6. #6
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 705
    Points : 4 783
    Points
    4 783
    Par défaut
    Tu peux aussi remplacer schedule par scheduleAtFixedRate

    En effet, la doc de schedule indique bien qu'on fini par avoir un décalage.
    Si ta tâche dure 5 minutes tous les jour à 18 heures alors son exécution se fera :
    • 18h le 1er jour
    • 18h05 le second jour
    • 18h10 le suivant
    • etc ...


    Par contre, scheduleAtFixedRate spécifie :
    If an execution is delayed for any reason (such as garbage collection or other background activity), two or more executions will occur in rapid succession to "catch up." In the long run, the frequency of execution will be exactly the reciprocal of the specified period
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Népomucène, oui scheduleAtFixedRate me parait plus approprié.

    Je viens de modifier le programme et je me suis rendue compte qu'il y a aussi un autre souci,
    quand j'instancie mon Calendar ev, le getInstance(), me donne la date et heure courante, et apres je ne fais que l'incrementer d'un jour,
    ce qui fait que je me pose la question à savoir : si je lance le programme à un instant T supposons

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    begin = 02 Janvier 2013 12h33...
    ev = 02 Janvier 2013 12h33...
    et je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ev.add(Calendar.DATE, 1)
    //est ce que donnera ev= 03 Janvier 2013 12h33????
    Si oui, alors à aucun moment je ne spécifie que je veux que ma tâche demarre à 7h, à moins que je ne la lance à 7h (une fois) et qu'il ne passe pas dans le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(begin.HOUR!=7....
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    else t.scheduleAtFixedRate (new ProcessXXXX, begin.getTime(),8640000)
    Merci de me dire ce que vous pensez de ça

  8. #8
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 705
    Points : 4 783
    Points
    4 783
    Par défaut
    Je pense que tu patauges ...
    Tu dois revenir à ta spécification première : "ma tâche doit démarrer à 7h tous les matins"

    ce qui veux dire que tu dois d'abord calculer un objet Date ou Calendar qui représente ce prochain moment.
    à l'instant où j'écris, il est 02/01/2013 14:53 donc ma tâche doit s'exécuter le 03/01/2013 07:00
    c'est ce prochainMoment que tu dois mettre dans un objet Date ou Calendar

    ensuite tu lui dis une seule fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t.scheduleAtFixedRate (new ProcessXXXX, prochainMoment ,8640000)
    et n'essaye pas de savoir si tu déclenche à 7h pile !
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Oui je me m’emmêle un peu les pinceaux ,
    Grâce à tes conseils Népomucène ,
    je pense que ce que j'ai ecrit ci-dessous devrait bien fonctionner demain matin

    PS : c'est fait exprès de démarrer la tâche à 7h30 ( car liés à d'autres traitements...)

    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
     
    Timer timer=new Timer();
    		Calendar begin=Calendar.getInstance();
    		Calendar ev=Calendar.getInstance();
     
    		/**
                     * si heure de lancement n'est pas 7h, on fait le traitement 1 fois
                     * puis on incremente d'un jour le calendrier ev et on met son heure à 7 h30
                     * ensuite on rappelle le timer avec la date de ev puis attente 24h
                     */
    		if(begin.HOUR != 7){
     
    			timer.schedule(ProcessXXXX(),begin.getTime());
    			ev.add(Calendar.DATE,1);
    			ev.set(Calendar.HOUR_OF_DAY, 7);
    			ev.set(Calendar.MINUTE, 30);
    			//System.out.println(ev.getTime());
    			timer.scheduleAtFixedRate(new ProcessXXXX(),ev.getTime(), 86400000);
    		}else{
    			timer.scheduleAtFixedRate(ProcessXXXX(),begin.getTime(), 86400000);
    		}

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Vous excuserez mon omission du new dans les appels de ProcessXXX(),
    c'est corrigé.

    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
     
    Timer timer=new Timer();
    		Calendar begin=Calendar.getInstance();
    		Calendar ev=Calendar.getInstance();
     
    		/**
                     * si heure de lancement n'est pas 7h, on fait le traitement 1 fois
                     * puis on incremente d'un jour le calendrier ev et on met son heure à 7 h30
                     * ensuite on rappelle le timer avec la date de ev puis attente 24h
                     */
    		if(begin.HOUR != 7){
     
    			timer.schedule(new ProcessXXXX(),begin.getTime());
    			ev.add(Calendar.DATE,1);
    			ev.set(Calendar.HOUR_OF_DAY, 7);
    			ev.set(Calendar.MINUTE, 30);
    			//System.out.println(ev.getTime());
    			timer.scheduleAtFixedRate(new ProcessXXXX(),ev.getTime(), 86400000);
    		}else{
    			timer.scheduleAtFixedRate(new ProcessXXXX(),begin.getTime(), 86400000);
    		}

  11. #11
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 705
    Points : 4 783
    Points
    4 783
    Par défaut
    Tel que tu l'as programmé, si on déclenche à :
    • 07:49:25 -> la tâche va s'exécuter tous les matins à 07:49:25
    • 10:35:47 -> une fois tout de suite ; puis tous les matins à 07:30:00

    donc ça marche à peut près !
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Oui tout parait correct,

    je l'ai démarré tout à l'heure.

    réponse demain

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Tache bien declenchée ce matin à 7h30.
    Tout fonctionne bien!
    Merci beaucoup pour vos conseils et aides.

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

Discussions similaires

  1. [Win98] Redémarrer mon pc tous les jours à une heure précise
    Par willytito dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 30/11/2008, 01h01
  2. lu tous les jours mais exécuté une seule fois par mois
    Par sianto dans le forum Scripts/Batch
    Réponses: 13
    Dernier message: 17/11/2008, 10h08
  3. Réponses: 1
    Dernier message: 30/05/2007, 15h29
  4. Arret de l'exécution de tous les jobs
    Par ahlemahlem dans le forum Oracle
    Réponses: 1
    Dernier message: 05/10/2006, 18h57
  5. [Débutant]Comment exécuter une fonction tous les jours
    Par pseudomh dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 21/06/2006, 17h10

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