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 :

thread local problème


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de nadsky
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 118
    Par défaut thread local problème
    Bonsoir à tous,

    Je dois écrire une classe contenant elle-même une classe interne.
    En fait, cette classe englobante a pour attributs des informations (profil, email...) concernant des utilisateurs.
    On me demande de créer une classe interne intitulée SecurityManager qui a pour seul attribut un thread local, destiné à stocker les informations sur les utilisateurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	private static ThreadLocal infosUser = new ThreadLocal();
    //variable dans laquelle on va stocker les infos utilisateurs
    Or, j'ai lu de nombreux tutos sur le net indiquant qu'il faut écrire trois méthodes lorsqu'on se sert d'un thread local :
    protected Object initialValue()
    public Object get()
    public void set(Object value)

    à quoi servent ces méthodes?
    Doit-on transtyper l'Object dans le type de la classe englobante?

    Pouvez-vous m'aider svp??
    merci d'avance,

    Nadsky

  2. #2
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut
    Or, j'ai lu de nombreux tutos sur le net indiquant qu'il faut écrire trois méthodes lorsqu'on se sert d'un thread local :
    protected Object initialValue()
    public Object get()
    public void set(Object value)
    J'ai l'impression que se sont les mots "il faut" qui te perturbe. Ce n'est pas une obligation mais plutôt un conseil de bonne pratique, de la même manière que l'on conseille fortement l'utilisation de setter/getter pour l'accès aux propriétés d'un objet

    à quoi servent ces méthodes?
    Doit-on transtyper l'Object dans le type de la classe englobante?
    ba justement, ce sont les setter et getter pour manipuler les données contenues dans ton LocalThread. En ce qui concerne la méthode initialValue, elle a pour objectif de supprimer la référence de ton objet dans ton LocalThread (quand ton utilisateur se déconnecte par exemple).

    Ce qu'il faut retenir de ça : mets les propriétés de ta classe en private, et met à disposition les méthodes adéquates pour accéder et/ou manipuler ces attributs de l'extérieur.

  3. #3
    Membre confirmé Avatar de nadsky
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 118
    Par défaut
    finalement, j'ai préféré créer une classe SecuriteFonctionnelle contenant seulement le thread local et les méthodes (getter, setter et remove) et ne pas la mettre en classe interne.
    Quant à l'autre classe,intitulée InfosUserFonctionnelle, elle contient toujours les informations concernant les utilisateurs (nom, prénom, profil, email...).
    Voici les getter et setter de ma classe contenant le thread local :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public InfosUtilisateurFonctionnel getInfosUser(){
    	return (InfosUtilisateurFonctionnel)infosUser.get();
    }
    public void setInfosUser(InfosUtilisateurFonctionnel inf){
    	infosUser.set(inf);
    }

    L'appli sur laquelle je suis est séparée en couches : présentation, métier, etc...et utilise Struts.il y-a donc des classes Action dans la couche présentation liées aux classes services de la couche métier.
    Pour le moment, on passe en paramètre des méthodes de services de la couche métier certaines informations concernant les utilisateurs, et ces méthodes de services sont appelées dans les classes action de la couche présentation, et cela semble assez intrusif.

    Mes question sont les suivantes:
    . Comment sont appelées les méthodes de ma classe contenant le thread local dans mes classes action et mes méthodes de la classe service??

    . Que doit contenir la méthode remove?

    Pouvez-vous m'aider,svp??

    Merci d'avance

    Nadsky

  4. #4
    Membre Expert
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Par défaut
    Bonjour,

    Tout d'abord tes methodes de ta classe doivent etre en static, ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class InfosUtilisateurFonctionnel () {
     
        private static ThreadLocal infosUser = new ThreadLocal();
     
        public static InfosUtilisateurFonctionnel getInfosUser(){
    	return (InfosUtilisateurFonctionnel)infosUser.get();
        }
     
        public static void setInfosUser(InfosUtilisateurFonctionnel inf){
    	infosUser.set(inf);
        }
    }
    La question apres est quand appeler le setInfosUser pour mettre a jour la ThreadLocal? Tu es en Struts donc dans un contxte WEB, tu peux allez voir ce post

    Comme tu verras dans ce post on parle de filter mais comme tu es en Struts, tu peux mettre a jour InfosUtilisateurFonctionnel dan sla method eprocess du RequestProcessor de Struts qu'il faut surcharger.

    Donc en gros il faut que tu stocke en session HTTP une instance InfosUtilisateurFonctionnel , puis dans la methode process du RequestProcessor, tu recuperes l'instance InfosUtilisateurFonctionnel de la session et tu mets a jour la ThreadLocal avec l'isntance mise en session InfosUtilisateurFonctionnel en appelant la methode setInfosUser.

    Apres dans toutes tes couches, tu pourras faire InfosUtilisateurFonctionnel .getInfosUser() et recuperer l'instance InfosUtilisateurFonctionnel dont tu as besoin.

    Angelo

  5. #5
    Membre confirmé Avatar de nadsky
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 118
    Par défaut
    Bonjour azerr, je te remercie de m'avoir répondu si rapidement,

    étant plus que débutante en struts (en effet, l'application était déja bien développée à mon arrivée), j'e n'ai pas bien saisi ce que tu as écrit :
    Citation Envoyé par azerr Voir le message

    Donc en gros il faut que tu stocke en session HTTP une instance InfosUtilisateurFonctionnel , puis dans la methode process du RequestProcessor, tu recuperes l'instance InfosUtilisateurFonctionnel de la session et tu mets a jour la ThreadLocal avec l'isntance mise en session InfosUtilisateurFonctionnel en appelant la methode setInfosUser.
    Pourrais -tu le reformuler,stp??

    Merci d'avance
    Nadsky

  6. #6
    Membre Expert
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Par défaut
    Je suppose que InfosUtilisateurFonctionnel est une instance qui vient d'un service d'authenfication (ou autres)?

    Il faut que cette instance soit stocke dans la session HTTP (peut etre qu'elle l'est deja).

    Apres il faut que tu regardes si dans ton application tu as surcharge le request processor de Struts. Si ca n'est pas fait il faut le surcharger (voir doc Struts) et surcharger la methode process du RequestProcessor.

    J'aivais fait ca cela dans mon projet GestCV peut etre que ca pourra t'aider.

    Angelo

Discussions similaires

  1. Développement Web: Thread local
    Par ghiwani80 dans le forum JSF
    Réponses: 4
    Dernier message: 05/12/2011, 11h44
  2. threads: local directory
    Par Adakite dans le forum Langage
    Réponses: 1
    Dernier message: 16/06/2010, 22h19
  3. [Réseaux local] Problème de connexion
    Par ttone dans le forum Hardware
    Réponses: 1
    Dernier message: 15/08/2008, 21h52
  4. [Conception] Thread local
    Par smutmutant2003 dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 29/01/2007, 21h04
  5. [Thread][socket]Problème de fermeture d'un thread
    Par meda dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 04/11/2004, 01h03

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