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 :

exécuter une tache périodiquement


Sujet :

Java

  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 76
    Par défaut exécuter une tache périodiquement
    salut tout le monde,
    alors je veux faire des tests sur des machines chaque 2 min.
    après une recherche sur internet, j'ai trouvé que la classe Timer et ses compatriotes feront l'affaire.
    j'ai lu qu'il faut faire ce qu'on veut exécuter dans le run() du TimerTask.
    sauf que moi je veux exécuter le execute() d'une Action.
    je ne vois pas trop comment faire et je me dirige vers votre aide.
    merci d'avance.

  2. #2
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 746
    Par défaut
    Rien ne devrait t'empercher de lancer ce que tu veux depuis le run() de ton timer.

    Pourrais tu détailler ton problème avec si possible ton code?

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 76
    Par défaut
    alors, voici le code de mon EtatServeurAction que je veux qu'il se répète chaque 2 min.

    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
    public class EtatServeurAction extends org.apache.struts.action.Action {
     
     
        private final static String SUCCESS = "success";
     
     
        public ActionForward execute(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response)
                throws Exception {
     
            ConnexionBD bd=new ConnexionBD();
            ConnexionBD bd1=new ConnexionBD();
            ConnexionBD bd3=new ConnexionBD();
            ConnexionBD bd4=new ConnexionBD();
            ConnexionBD bd5=new ConnexionBD();
            MailJava m=new MailJava();
            EtatServeurForm es=new EtatServeurForm();
            Ping p=new Ping();
            stat s=new stat();
            int iTemp=0;
            int nTemp=0;
     
            bd5.lire("select * from config");
            int nb=Integer.parseInt(bd5.résultat.getString("nombre_panne"));
     
                bd.lire("select * from serveurs");
            while(bd.résultat.next())
            {
                String ip=bd.résultat.getString("add_ip");
                String idserv=bd.résultat.getString("idserveur");
                boolean eta=p.ping(ip);
                iTemp=Integer.parseInt(bd.résultat.getString("i"));
                nTemp=Integer.parseInt(bd.résultat.getString("n"));
                s.stat(ip, idserv);
                if(eta)
                {iTemp=0;
                 nTemp=0;
                 bd3.miseAJour("UPDATE serveurs SET etat='Opérationnel' where idserveur='"+bd.résultat.getString("idserveur")+"'");
                 bd3.miseAJour("UPDATE serveurs SET i='"+iTemp+"'where idserveur='"+bd.résultat.getString("idserveur")+"'");
                 bd3.miseAJour("UPDATE serveurs SET n='"+nTemp+"'where idserveur='"+bd.résultat.getString("idserveur")+"'");
     
                }
                else
                {iTemp++;
                 bd4.miseAJour("UPDATE serveurs SET etat='Non opérationnel' where idserveur='"+bd.résultat.getString("idserveur")+"'");
     
     
                    if(iTemp==nb && nTemp==0)
                    {
                    {
                        m.envoyer("test@gmail.com","IP", "NOM");
     
                     nTemp=1;
                     iTemp=0;
     
                    }
                 bd4.miseAJour("UPDATE serveurs SET i='"+iTemp+"'where idserveur='"+bd.résultat.getString("idserveur")+"'");
                 bd4.miseAJour("UPDATE serveurs SET n='"+nTemp+"'where idserveur='"+bd.résultat.getString("idserveur")+"'");
                 }
     
            }
     
     
            return mapping.findForward(SUCCESS);
     
            }
    }
    le problème est que je ne peux pas créer un objet ni appeler cette méthode.

  4. #4
    Membre expérimenté Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Par défaut
    Salut,

    Ce n'est pas un problème java mais javascript. Il faut juste que ta page se recharge toutes les x minutes. Je croit que c'est la méthode setTimeout que tu dois utiliser.

    A+
    Hydraland

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 76
    Par défaut
    franchement j'ai jamais utiliser le javascript.
    plus précisément, l'utilisateur entre deux nombre x et y, le x pour pinger les machines tant qu'elles fonctionnent bien.une fois il ping une machine et la trouve non opérationnelle, il doit changer la fréquence du ping à y.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Pour des tâches de fond, laisse tomber le Struts Action, ceux-ci sont liés à une requetes http, c'est leur rôle. Hors si tu veux faire juste des pings toutes les 2 minutes, c'est pas comme ça qu'il faut faire (sauf si tu veux aussi afficher la pages toutes les deux minutes, voir plus bas). Donc tu sort ton code de cette Action et tu le met dans ton timertask ou dans une quelconque classe de soutiens Si ça doit être réutilisable. J'émetterais aussi un doute quand au fait de lancer un ping sur n machine toutes les deux minutes. Si t'as 15 machines dont deux qui sont offline et 13 qui ont un temps de réponse moyen de 10ms, tu va mettre 130ms + 2*temps de timeout. Et la pluspart du temps le ping a un timeout d'environ 2 minutes, donc toutes les 2 minutes tu va lancer un process qui peux durer 4 minutes

    Pour juste rafraichier une page toutes les X secondes, il suffit d'utiliser le header HTTP Refresh. Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    response.setHeader("Refresh", "120; url=http://www.example.com/");

  7. #7
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 76
    Par défaut
    merci pour vos réponses.
    je m'explique.les 2 min etaient juste à titre d'exemple.
    pour la méthode refresh, j y ai pensé mais ca ne va pas marcher car je dois changer le temps de rafraichissement.
    mon idée c'est qu'il y ait deux timers. un qui exécute le code chaque 5 min par exemple, et un autre chaque 10 min.et je ferais des if pour faire soit le premier soit le deuxième.
    pour transporter tout mon code de l'action à une autre classe, ce n'est pas évident, vu que, premièrement, la page doit afficher les pings et d'autres informations a chaqe rafraichissement, et deuxièmement, ca ferait du bordel à mon code.
    reste je pense le javascript.
    à vous la balle !

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Citation Envoyé par fangriz Voir le message
    reste je pense le javascript.
    à vous la balle !
    Le javascript c'est exactement le même qu'un refresh de la page, la technique et différentes, mais tu va de toutes manière décider de rafraichir toute ta page à une moment donné.. Pourquoi, plutot, vu que tu as une base de données, tu ne ferais pas un timer qui ping les machines dans l'ordre et met à jour des informations de la base de données. Ta page web n'aurais plus qu'à afficher les dernières informations. Avantages: tes tests continuent meme quand la page n'et plus utilisée, tu ne fais pas deux fois les ping si tu as deux utilisateurs de la page.

  9. #9
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 76
    Par défaut
    oui, je suis d'accord, le javascript ne va pas marcher.
    sur ma page jsp,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <th><bean:write name="serveur" property="nom_serveur"/></th>
                                            <th><bean:write name="serveur" property="etat"/></th>
                                            <th><bean:write name="serveur" property="cpu"/></th>
                                            <th><bean:write name="serveur" property="hdd"/></th>
    donc ce sont juste des getter.

    donc tout mon traitement est fait dans mon action et stocke les valeurs dans ma base de données.
    la question reste est ce que je px utiliser mon ActionForm dans une autre classe.
    ceci revient à prendre le code de mon Action et le mettre dans une autre classe et puis est ce qu'il y a possibilité de lier cette classe à ma page jsp.

  10. #10
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    tu peux simplement dépacer le code qui fait les pings dans une autre classe puis remplacer ton action form par du code qui va interroger ta base de donnée et remplir le bean struts avec les données ad-hoc.

  11. #11
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 76
    Par défaut
    je crois que ca peut marcher, je vais tester et vous tenir en courant.
    en tout cas, merci beaucoup

  12. #12
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 76
    Par défaut
    Je viens de faire toutes mes classes, avec celle du timer.
    j'ai fait deux timer, un Tempo_normale et un Tempo_panne.
    maintenant la question qui se pose, comment exécuter ces timers.
    moi je pense à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Tempo_normal tn=new Tempo_normal();
            tn.Tempo_normal();
            Tempo_panne tp=new Tempo_panne();
            tp.Tempo_panne();
    ceci est dans mon Action.
    est ce que juste comme ca ils vont s'exécuter ?

  13. #13
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Attention que, si tu les exécute dans ton action, tu va avoir le problème de t'assurer que les timer ne démarrent qu'une seule fois. Sinon, si ce sont des TimerTask, il suffit de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Timer t = new Timer();
    t.schedule(task,0,120000);
    Pour une tache démarrant immédiatement, avec un délai entre exécutions de 120 secondes.

  14. #14
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 76
    Par défaut
    je poste l'un de mes timer pour voir:
    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
     
    public class Tempo_normal
    {
        public void Tempo_normal()throws Exception
        {
        final ConnexionBD bd8 =new ConnexionBD();
        ConnexionBD bd1 =new ConnexionBD();
        bd1.lire("select * from config");
            long période = 60*1000*(Integer.parseInt(bd1.résultat.getString("frequence_normale")));             // délai avant de répéter la tache : 2000 = 2  seconde
            long début = 0;                    
            Timer timer = new Timer();             
            TimerTask tache = new TimerTask() {     
                @Override
                    public void run() {
                        bd8.lire("select * from serveurs");
                        try{
                            while(bd8.résultat.next())
                                {
                                String etatemp = bd8.résultat.getString("etat");
                                if(etatemp=="Opérationnel")
                                    {
                                    String nomtemp = bd8.résultat.getString("nom_serveur");
                                    String iptemp = bd8.résultat.getString("add_ip");
                                    String idtemp = bd8.résultat.getString("idserveur");
                                    int itemp = Integer.parseInt(bd8.résultat.getString("i"));
                                    int ntemp = Integer.parseInt(bd8.résultat.getString("n"));
                                    Traitement tt=new Traitement();
                                try {
                                    tt.Traitement(iptemp, idtemp, itemp, ntemp, nomtemp);
                                } catch (Exception ex) {
                                    Logger.getLogger(Tempo_normal.class.getName()).log(Level.SEVERE, null, ex);
                                }
                                    }
                                }
                            }catch(SQLException ex)
                                {System.out.println("il y a quelque chose qui cloche");}
                    }
            };
            timer.scheduleAtFixedRate(tache,début,période);
        }
    }
    je pense qu'avec la dernière ligne, les instances que j'ai fait au message précédent suffiront.non ?

    j'essai d'accéder à ma base de données et il m'affiche le message suivant:
    Before start of result set

    de quoi cela peut s'agir ?

  15. #15
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 76
    Par défaut
    pour le Before start of result set, j'ai pu le résoudre.
    en fait, même si on lit une table qui a une seule ligne, il faut toujours faire un while(bd.résultat.next()).

    pour les timer, ca marche, mais il me reste le rafraichissement de la page.
    les timers actualisent ma base de données, mais pas la page.
    alors dois-je mettre un refresh ??

  16. #16
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    pour la page tu fait un refresh, genre toutes les 5 secondes tu réaffiche les dernières valeurs.

  17. #17
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 76
    Par défaut
    un refresh de la page exécutera l'action.
    voici ma nouvelle action, je pense que les timer vont se réexécuter!!

    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
     
    public ActionForward execute(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response)
                throws Exception {
            HttpSession session=request.getSession();
            ConnexionBD bd=new ConnexionBD();
            EtatServeurForm es;
     
            Tempo_normal tn=new Tempo_normal();
            tn.Tempo_normal();
            Tempo_panne tp=new Tempo_panne();
            tp.Tempo_panne();
     
            List<EtatServeurForm> st=new ArrayList();
     
     
                bd.lire("select * from serveurs");
                while(bd.résultat.next())
            {
                    String nom=bd.résultat.getString("nom_serveur");
                    String etat=bd.résultat.getString("etat");
                    String cpu=bd.résultat.getString("cpu");
                    String hdd=bd.résultat.getString("hdd");
     
                    es=new EtatServeurForm(nom,etat,cpu,hdd);
                    st.add(es);
            }
     
            session.setAttribute("serveurs", st);
            return mapping.findForward(SUCCESS);
     
            }
    }
    donc à vous de juger.

  18. #18
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    C'est pour ca que tu dois t'assurer que tes timer ne sont exécuté qu'une seule fois. Par exemple en les créant et démarrant dans le constructeur de l'action.

  19. #19
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 76
    Par défaut
    je ne vois pas de constructeur.
    mon action est dans le message précédent, comment je dois procéder exactement. encore merciiiiiiii

  20. #20
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Citation Envoyé par fangriz Voir le message
    je ne vois pas de constructeur.
    Ben t'as qu'à le créer. Quoique j'ignore si struts garantit que ton objet action sera un singleton. Idéalement, il faudrait mettre tes timers en champs statiques, utiliser un bloc synchronized dans ton action et dans ce bloc testé si les timer sont null, si oui on les crée et on les démarre. Ou tu utilise tout autre système au choix que tu désire pour garantir que tes timer sont démarrés qu'une seule fois.

Discussions similaires

  1. Exécuter une tache ant après compilation
    Par titouille dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 09/06/2008, 22h40
  2. Réponses: 3
    Dernier message: 08/04/2008, 14h29
  3. Service windows exécutant une tâche périodique
    Par Nico_stras dans le forum C#
    Réponses: 13
    Dernier message: 06/03/2008, 09h46
  4. [VBA]Exécuter une tache sur chaque ligne d'une table
    Par Tierisa dans le forum VBA Access
    Réponses: 1
    Dernier message: 13/04/2007, 17h53
  5. Exécuter une tache en arrière-plan
    Par EvilAngel dans le forum Windows
    Réponses: 6
    Dernier message: 20/02/2007, 12h15

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