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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    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
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

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

  3. #3
    Membre chevronné
    Homme Profil pro
    Java
    Inscrit en
    Mai 2011
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    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
    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 713
    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 713
    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
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    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 713
    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 713
    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/

+ 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, 00h01
  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, 09h08
  3. Réponses: 1
    Dernier message: 30/05/2007, 14h29
  4. Arret de l'exécution de tous les jobs
    Par ahlemahlem dans le forum Oracle
    Réponses: 1
    Dernier message: 05/10/2006, 17h57
  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, 16h10

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