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

Servlets/JSP Java Discussion :

Thread,scheduler dans un j2EE?


Sujet :

Servlets/JSP Java

  1. #1
    Membre averti
    Inscrit en
    Août 2002
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 30
    Par défaut Thread,scheduler dans un j2EE?
    Bonjour, j'ai un probleme qui est nouveau pour moi en j2EE, je voudrais le partager avec vous pour avoir vos idées lumineuses.

    J'ai créé une sorte de chat room en j2ee (ressemblant un peu a de l'irc mais avec un seul salon), les gens se connectent directement avec leur login. Chaque personne vois la liste des gens presents sur le salon.
    Lorsqu'un utilisateur se deconnecte la liste des utilisateurs devrait avoir le nom de cette personne s'effacer (equivalent du ping timeout). Comme je ne peux pas recuperer d'action sur la fermeture de sa fenetre, la deconnection ou n'importe quelle autre facon de partir d'une personne qui etait dans la room, je me trouve a chercher une solution pour inspecter regulierement depuis quand telle ou telle personne n'a rien demandé au serveur afin de les "dégager" de la liste les deconnectés.

    Coté client j'ai un ajax qui interoge regulierement le serveur pour mettre a jour le chat, coté serveur je stock en meme temps la derniere fois que chaque utilisateur a demandé une mise a jour du chat. Il me suffit donc de regarder si ca fait par exemple 3 minutes que la personne a rien demandé, si c'est le ca c'est qu'il est deconnecté.
    Mon probleme reste seuleument sur comment lancer cette inspection a intervalle regulié sur ma liste des connectés d'un salon?
    Une solution simple serait que je le fasse a chaque requete de rafraichissement du salon, mais je trouve ca lourd et inadequate.
    J'ai lu sur internet qu'on ne devait pas gerer nos propres threads en j2EE...
    J'ai decouvert quartz aussi mais je me demande comment lui donner les objets stockés dans le contexte, c.a.d ce que je dispose dans une servlet mais qui serait aussi disponible dans le thread.

    Voila j'espere avoir plus ou moins assez clair!! N'hesitez pas pour les questions.

  2. #2
    Membre expérimenté Avatar de aJavaDeveloper
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 248
    Par défaut
    J'ai lu sur internet qu'on ne devait pas gerer nos propres threads en j2EE...
    Ah bon ?
    Et pourquoi pas ?
    Ton problème ne me semble pas très complexe...
    Je ne vois pas en quoi le lancement d'un petit thread serait problématique...

  3. #3
    Membre averti
    Inscrit en
    Août 2002
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 30
    Par défaut
    C'est dans les specifications j2EE. En meme temps je suis pas trop là pour discuter des specs, de plus je lancerais qu'un seul thread au niveau du demarrage du serveur qui inspecte tous les chats donc spec ou pas ca me derange pas si ca marche quand meme...
    Par contre dans mon thread je dois avoir le ServletContext d'accessible pour inspecter regulierement mes chats qui sont dans une hashMap du servletContext, comment je lui passe ca a mon thread?

  4. #4
    Membre expérimenté Avatar de aJavaDeveloper
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 248
    Par défaut
    C'est dans les specifications j2EE.
    Ah bon ?
    Pourrais-tu me donner le lien du site où tu as lu ça (sans remettre en cause ce que tu dis) ?
    Si je demande ça, c'est parce que j'utilise souvent des threads dans mes applications J2EE et je ne vois pas en quoi c'est problématique dans le cadre d'un développement web (pour autant que les threads soient correctement gérés).
    Par contre dans mon thread je dois avoir le ServletContext d'accessible pour inspecter regulierement mes chats qui sont dans une hashMap du servletContext, comment je lui passe ca a mon thread?
    Si j'étais toi, je ne passerais pas ton servletContext mais bien directement une référence vers la hashMap que tu places dans ton servletContext.
    Tu éviteras ainsi d'utiliser dans ton thread (et donc dans ta couche business) des éléments propres aux servlets (et donc à ta couche web).

  5. #5
    Membre averti
    Inscrit en
    Août 2002
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 30
    Par défaut
    Citation Envoyé par aJavaDeveloper
    Ah bon ?
    Pourrais-tu me donner le lien du site où tu as lu ça (sans remettre en cause ce que tu dis) ?
    Si je demande ça, c'est parce que j'utilise souvent des threads dans mes applications J2EE et je ne vois pas en quoi c'est problématique dans le cadre d'un développement web (pour autant que les threads soient correctement gérés).
    J'ai vu ca un peu partout sur les dicussions et blogs en cherchant une solution a mon probleme, du coup j'ai voulu me renseigner aussi et j'ai trouvé une discussion serieuse ici : http://blog.w1c.ca/?p=92
    En particulier à la fin on a :

    “The EJB 2.0 and 2.1 specifications prohibit an EJB from managing threads. This includes starting, stopping, suspending and resuming threads.

    EJB 2.0, Section 24.1.2 and EJB 2.1, Section 25.1.2 state the following:

    Programming Restrictions
    The enterprise bean must not attempt to manage threads. The enterprise bean must not attempt to start, stop, suspend, or resume a thread; or to change a thread’s priority or name. The enterprise bean must not attempt to manage thread groups.

    For a servlet, the J2EE 1.3 and 1.4 specifications allow web components to create and manage threads, however, the execution and behavior of these threads must be tightly monitored by the application, not the application server. The specifications state the following:

    J2EE 1.3 and J2EE 1.4:
    J2EE.4.2.1.1 Transaction Requirements
    If a web component creates a thread, the J2EE platform must ensure that the newly created thread is not associated with any JTA transaction.

    J2EE.4.2.3 Transactions and Threads
    JTA transactions should be started and completed in the thread in which the service method is called. Additional threads that are created for any purpose should not attempt to start JTA transactions.”
    Je ne suis pas tres forte en anglais mais je pense que c'est moins restreint que ce les gens disent non?

    Sinon pour mon thread je vais passer la hashMap qui contient les variables qui sont modifiés en cours d'execution du serveur, je vais voir ce que ca donne.

  6. #6
    Membre expérimenté Avatar de aJavaDeveloper
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 248
    Par défaut
    Merci pour ta référence.
    Apparemment, l'utilisation des threads est prohibée lorsque tu utilises des EJB.
    Comme je n'ai jamais utilisé d'EJB, je ne le savais pas .
    Pour ce qui est des servlets, l'utilisation de threads ne semble poser aucun problème pour autant
    • qu'ils soient correctement gérés par l'application
    • qu'ils ne soient pas associés à des transactions JTA

  7. #7
    Membre averti
    Inscrit en
    Août 2002
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 30
    Par défaut
    Bon voila ca marche nikel, j'ai pensé à faire un .cancel() de mon timer dans la methode destroy de ma classe qui étend HttpServlet, même si il passe bizarrement un certain temps dessus. Je pense qu'il n'y a que ca a penser pour que ce soit propre?

    Mon petit lancement pour ceux que ca interesse
    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
     
    public void init(ServletConfig config) throws ServletException{
     
            super.init(config);
     
            log.debug("servlet d'initialisation en cours");
            //creation de la map des chats du site
            ServletContext servletContext = getServletContext();
            Map chats=Collections.synchronizedMap(new HashMap());
            //mise en contexte
            servletContext.setAttribute("chats",chats);
     
            //lancement du thread de surveillance des deconnections
            timer=new Timer();
            GregorianCalendar gc=new GregorianCalendar();
            gc.add(Calendar.SECOND,3);
            timer.scheduleAtFixedRate(new TimeoutTimer(chats),gc.getTime(),10000);
     
        }
    J'ai synchronisé la map, est-ce necessaire? Ca risque peut-etre de ralentir l'execution si il y a beaucoup d'utilisateur de mon appli vu que la map est tres souvent utilisé?

  8. #8
    Membre Expert
    Avatar de alexismp
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 503

  9. #9
    Membre averti
    Inscrit en
    Août 2002
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 30
    Par défaut
    ouais j'avais vu quartz mais j'ai eu peur d'utiliser une machine à gaz pour pas grand chose. Je pense pas que ca apporte grand chose par rapport a la solution simple que j'ai faite, j'ai parcouru rapidement la doc mais j'ai peut etre loupé quelque chose...

  10. #10
    Membre expérimenté Avatar de aJavaDeveloper
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 248
    Par défaut
    j'ai eu peur d'utiliser une machine à gaz pour pas grand chose
    Je ne connais pas bien Quartz mais je suis d'accord avec toi.
    Si ton seul besoin est de faire un check tous les x secondes, un simple thread me semble amplement suffisant...

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

Discussions similaires

  1. [Thread] Blocage dans mon programme
    Par Xo Sonic oX dans le forum EDT/SwingWorker
    Réponses: 4
    Dernier message: 18/06/2005, 17h12
  2. [Thread] DB dans un thread
    Par Pedro dans le forum Bases de données
    Réponses: 5
    Dernier message: 02/06/2005, 13h14
  3. [Thread] Recherche dans une BDD
    Par Pedro dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/05/2005, 14h03
  4. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 08h15

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