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

avec Java Discussion :

[Débutant]Utilisation des Threads


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 157
    Par défaut [Débutant]Utilisation des Threads
    Bonjour à tous, voila je suis actuellement en stage dans une boite pour laquelle j'essaye de réaliser une petite appli qui fait des requêtes sur des serveurs.

    J'ai fait un fichier xml dans lequel on retourouve pour chaque élément serveur, une liste d'url et les paramètres de connexion à une base de donnée ainsi qu'une requêtes sql.
    Lorsque j'exécute mon appli, je teste les urls ( et la base correspondante si une des url renvoit une erreur de type 40x ou 50x)

    Mon problème est que j'aimerais pouvoir mettre en pause les requêtes sur un serveur et continuer à tester les autres. J'ai regardé beaucoup de doc sur les Thread, je pense avoir compris le fonctionnement mais je n'arrive pas à les utiliser correctement pour mon appli. Voila cela fait deux semaine que j'essaye sans succès voici ma classe principale si vous pouvez m'aider...

    public class Main{

    static ServerParameters srvParam = null;
    String nomServer = null;
    String nomDataBase = null;
    String reponseResultUrl = null;
    String reponseResultDb = null;
    ResultParameters resultUrl = null;
    ResultParameters resultDb = null;
    ArrayList listUrl = null;
    ServerListXml svrXml = new ServerListXml();
    Timer t = null;
    ArrayList listeSrvParameter = svrXml.getListeServerXml();
    Calendar calender = null;
    ArrayList reponseKo = null;
    ReponseKoParameter reponseKoParam = null;
    String repDb = null;

    public Main(ServerParameters srvParam) {

    Main.srvParam = srvParam;
    t=new Timer();
    t.schedule(new Repet(), 0, 600);
    }


    class Repet extends TimerTask {

    public void run() {

    calender= Calendar.getInstance();
    reponseKo = new ArrayList();
    for (int i = 0; i < listeSrvParameter.size(); i++)
    {
    srvParam = (ServerParameters)listeSrvParameter.get(i);
    listUrl = srvParam.getListeUrl();

    nomServer= srvParam.getServerName();
    nomDataBase = srvParam.getDbParameters().getDbType();
    System.out.println("Test du serveur " + nomServer);

    for (int j = 0; j < listUrl.size(); j++ )
    {
    resultUrl = CheckUrl.checkUrl((UrlParameters)listUrl.get(j));
    reponseResultUrl = resultUrl.getCodeReponse();

    String logResultUrl = "Connexion à l'Url " + resultUrl.getNomDuTest();
    String logReponseUrl = "resultUrl : " + reponseResultUrl + "\n";
    System.out.println(logResultUrl);
    System.out.println(logReponseUrl);

    if(!(reponseResultUrl.equals("OK")))
    {
    String repServerName = "\r\n" + "============== " +" alerte "+ ", serveur " + nomServer +" =============="+ "\r\n";
    String repUrl = calender.getTime() +"\t"+ logResultUrl +"\t"+ logReponseUrl;
    try {
    resultDb =
    CheckDataBase.checkData(srvParam.getDbParameters());
    } catch (SQLException e) {
    e.printStackTrace();
    }
    reponseResultDb = resultDb.getCodeReponse();
    String logResultDb = "Test de la Base " +nomDataBase+ " " +
    resultDb.getNomDuTest();
    String logReponseDb = "resultDB : " + reponseResultDb + "\n";
    System.out.println(logResultDb);
    System.out.println(logReponseDb);

    if(!(reponseResultDb.equals("OK")))
    {
    repDb = calender.getTime()+"\t"+ logResultDb +"\t"+
    logReponseDb;
    }
    reponseKoParam = new ReponseKoParameter(repServerName,repUrl,repDb);
    reponseKo.add(reponseKoParam);
    }
    }

    for(int m = 0; m < reponseKo.size(); m ++)
    {
    reponseKoParam = (ReponseKoParameter)reponseKo.get(m);
    LogSentinelle.ecrire(reponseKoParam.getServerNameKo());
    LogSentinelle.ecrire(reponseKoParam.getUrlReponseKo());
    LogSentinelle.ecrire(reponseKoParam.getDbReponseKo());
    }
    }
    }
    }

    public static void main(String[] args)throws Exception{
    Main repet = new Main(srvParam);

    }
    }


  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 137
    Par défaut
    Bonjour,
    Dans ton code il n'y apparemment que 2 thread.
    Le thread principal (main) qui ne fait rien, le thread de l'execution de TimerTask.

    La méthode run est exécutée par le thread TimerTask a cadence fixe. Il n'y a pas de parallellisation des traitements.

    Qu'est ce que tu veux paralleliser ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 157
    Par défaut
    j'aimerais pouvoir faire une sorte de multi-threadring si je ne dis pas de bêtise, par exemple si mes requêtes sur un serveur renvoient la réponse "KO" je fait une pause sur les requêtes de ce serveur pour le prochain passage dans la boucle et je passe aux tests des autres serveurs. il faudrait en fait paralleliser les tests sur chaque élément serveur, le problème est que ma boucle test un serveur après l'autre et si je met un thread dans ma boucle avec la méthode wait() par exemple, la boucle s'arrete un temps donné et ne passe pas au test suivant.

  4. #4
    Membre éclairé
    Profil pro
    Abcde
    Inscrit en
    Août 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Abcde
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2004
    Messages : 59
    Par défaut
    Citation Envoyé par maniolo
    Bonjour à tous, voila je suis actuellement en stage dans une boite pour laquelle j'essaye de réaliser une petite appli qui fait des requêtes sur des serveurs.

    pourquoi ecrire une appli qui fait ca ? il en existe plein.

    essaye donc JMeter chez apache

    @+

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 157
    Par défaut
    Citation Envoyé par yopiyop
    pourquoi ecrire une appli qui fait ca ? il en existe plein.

    essaye donc JMeter chez apache

    @+
    C'est pas moi qui ai choisi, c'est la boite dans laquelle je fait le stage qui m'a demandé...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 137
    Par défaut
    Il faut donc paralleliser les appels à TimerTask

    Je suppose qu'en créant autant de timer que de serveur alors ton Repet.run sera traité dans des threads différents
    (facilement a tester, tu rajoutes un print de Thread.getCurrentThread().getName() dans la methode Repet.run pour savoir dans quel thread tu te trouves)

    Pour démarrer tes timers :

    for (int j = 0; j < listUrl.size(); j++ )
    {
    t=new Timer();
    t.schedule(new Repet((UrlParameters)listUrl.get(j)), 0, 600);

    }

    en passant au constructeur de Repet l'url sur laquelle il travaille

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 157
    Par défaut
    Merci pour tes réponses, je crois comprendre le principe , cependant j'ai deux questions bêtes...

    Citation Envoyé par manitoba
    Pour démarrer tes timers :

    for (int j = 0; j < listUrl.size(); j++ )
    {
    t=new Timer();
    t.schedule(new Repet((UrlParameters)listUrl.get(j)), 0, 600);

    }
    dois-je le placer ceci le constructeur de ma classe Main et si oui ne vais-je pas avoir un javanullpointerexception? comme ceci :
    public MainSentinelle2(ServerParameters srvParam) {
    MainSentinelle2.srvParam = srvParam;
    for (int j = 0; j < listUrl.size(); j++ )
    {
    t=new Timer();
    t.schedule(new RepetSentinelle((UrlParameters)listUrl.get(j)), 0, 600);
    }
    }
    Citation Envoyé par manitoba
    en passant au constructeur de Repet l'url sur laquelle il travaille
    La je comprend pas trop... Repet est la méthode que j'exécute dans mon Main, je dois lui créé un constructeur ?

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 137
    Par défaut
    Citation Envoyé par maniolo
    dois-je le placer ceci le constructeur de ma classe Main et si oui ne vais-je pas avoir un javanullpointerexception?
    Non ya pas spécialement de raison
    Par contre ton constructeur de MainSentinelle est bizarre.
    Pourquoi, MainSentinelle.srvParam = srvParam

    Citation Envoyé par maniolo
    La je comprend pas trop... Repet est la méthode que j'exécute dans mon Main, je dois lui créé un constructeur ?
    Repet est pas une méthode c'est une classe.
    voir ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Class Repet implements Runnable { 
    ...
    public void run() {
    ....}
     
     }
    il faut simplement que tu lui ajoutes un membre d'instance (a ne pas déclarer en static)

    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
    Class Repet implements Runnable { 
     
    UrlParam _urlServeur;
     
    public Repet(UrlParam url)
    {
      _urlServeur = url;
    }
    ...
    public void run() {
     
       // Je fais mon traitement en utilsant _urlServeur
    ....}
     
     }

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

Discussions similaires

  1. [+ou- débutant] utilisation des sémaphores
    Par Biosox dans le forum Windows
    Réponses: 4
    Dernier message: 26/05/2008, 12h23
  2. Avis sur la bonne utilisation des Threads
    Par Pitivier dans le forum Général Java
    Réponses: 8
    Dernier message: 28/11/2006, 20h07
  3. connexion socket utilisant des threads
    Par alceste dans le forum C++
    Réponses: 16
    Dernier message: 14/10/2006, 12h00
  4. Utilisation des threads
    Par Valinor dans le forum Linux
    Réponses: 2
    Dernier message: 30/11/2005, 16h41
  5. Utilisations des Threads
    Par phoenix440 dans le forum Réseau
    Réponses: 15
    Dernier message: 21/08/2005, 17h19

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