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

Spring Web Java Discussion :

Controllers Spring : thread-safe ?


Sujet :

Spring Web Java

  1. #1
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 50
    Par défaut Controllers Spring : thread-safe ?
    Bonjour,

    Sur le projet sur lequel je viens d'arriver, je constate que tous les controllers Spring contiennent des champs déclarés en tant que variables d'instance et non pas en tant que variables locales de la méthode handleRequestInternal().

    Ma question est : ces controllers sont-ils thread-safe ? En d'autre termes, ne risque-t-on pas de mélanger les sessions et les données ?

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 143
    Par défaut
    http://static.springframework.org/sp...ontroller.html

    Any implementation of the Controller interface should be a reusable, thread-safe class, capable of handling multiple HTTP requests throughout the lifecycle of an application. To be able to configure a Controller easily, Controller implementations are encouraged to be (and usually are) JavaBeans.
    D'après ce que tu dis, ta classe n'a pas l'air d'être thread-safe du tout... Normalement tu ne dois avoir en variable d'instance que d'autres services qui sont importés (au passage, ce ne sont pas forcément tous des singletons!), et pour ce qui concerne les variables utilisées par ta requête en cours, le ModelAndView est là pour ça.

    J'ai bien dit "normalement", il y a par exemple la possibilité d'utiliser le "ThrowawayController", qui lui doit avoir un scope "prototype", et qui par sa nature même n'a pas à être thread-safe.

    Il faudrait que tu donnes un exemple pour mieux voir ton problème.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 50
    Par défaut
    Merci de ta réponse ! Je vais te donner un exemple :

    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
     
     
    public class A extends AbstractController {
     
        private Injected injected;
        private MyOptions myOptions;
     
        @Override
        protected ModelAndView handleRequestInternal(HttpServletRequest servletRequest, HttpServletResponse servletResponse)
                throws Exception {
     
            Map<String, Object> model = new HashMap<String, Object>();
            String backUrl;
            if (monTest) {
                backUrl = "quelquechose";
            } else {
                backUrl = "autre chose";
            }
            model.put("backUrl", backUrl);
     
            String b = "quelque chose d'autre";
            model.put("b", b);
     
            int monInt = this.myOptions.getQuelqueChose();
            model.put("monInt", monInt);
     
            return new ModelAndView("MaPage", model);
        }
     
        @Required
        public void setInjected(Injected injected) {
            this.injected = injected;
        }
     
        @Required
        public void setMyOptions(MyOptions myOptions) {
            this.myOptions = myOptions;
        }
     
    }
    Alors, dans ce code, ce dont je suis à peu près sûr :

    - backUrl et b ne peuvent ne peuvent voir leurs valeurs "confondues" au cours des différentes requêtes puisque ce sont des variables locales

    - de même le modèle qui est lui-même local.

    Cependant, je m'aperçois que dans nos divers Controller, les variables d'instances sont toutes des valeurs injectées par Spring, comme myOptions et injected dans mon exemple. Et là, je me dis que Spring doit bien faire les choses puisqu'on est obligé de mettre les valeurs injectées en champ d'instance, vu qu'elles sont injectées par setter. Qu'en pense-tu ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 143
    Par défaut
    Je suis d'accord avec toi sur toute la ligne! Ton code devrait être bon, à moins qu'il y ait des choses bizarres dans MyOptions par exemple.
    Sinon tu peux aussi tester en mode debug, pour que tu sois sûr de ce qu'il se passe.

  5. #5
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 50
    Par défaut
    Si je me mets en mode debug et qu'il y a mélange de session, que suis-je censé voir ? Dois-je tester avec deux navigateurs ?

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 143
    Par défaut
    Oui, tu testes avec deux navigateurs en parallèle, et tu regardes le contenu de tes variables d'instance en "pas à pas". C'est un peu bourrin mais au moins tu es certain que tout fonctionne bien.
    Là ton code a l'air OK, mais tu n'en as posté qu'une partie, il y a peut être un ennui ailleurs : c'est donc une manière pour toi de t'assurer.

  7. #7
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 50
    Par défaut
    Hé hé merci beaucoup ! Je vais faire ça.

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

Discussions similaires

  1. [RCP] Treeviewer non thread-safe ?
    Par Guildux dans le forum Eclipse Platform
    Réponses: 4
    Dernier message: 09/01/2007, 13h00
  2. fonction de stdio.h thread safe ??
    Par boolzor dans le forum POSIX
    Réponses: 3
    Dernier message: 30/04/2006, 20h03
  3. Code "Thread Safe" ?
    Par Neitsa dans le forum C++
    Réponses: 3
    Dernier message: 23/12/2005, 14h33
  4. [Language]Immutable & Thread-Safe
    Par Repti dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 21/12/2005, 15h50
  5. [MFC] CMAP non thread safe ?
    Par fmarot dans le forum MFC
    Réponses: 5
    Dernier message: 04/10/2005, 13h21

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