Point technique: les variables locales à un thread Introduction au problème Notre application est réalisé grâce à la technologie J2EE, elle fonctionne donc sur une plateforme java grâce à un seveur d'application tel que tomcat. Elle est donc de manière évidente multi-utilisateur, chaque utilisateur ouvrant une session provoque la création d'un thread mais ils partagent tous une même base de d'objets sur la machine virtuel java (JVM). Cette base permet un partage simple des variables static, variables accessibles facilement depuis n'importe où dans l'application. Un exemple simple est l'existence de l'objet Configuration qui possède toutes la description du workflow, qui doit être le même objet pour tout les utilisateurs. **SCHEMA DU SINGLETON ACCESIBLE+RAPPEL FONCTIONNEMENT DES STATIC PAR RAPPORT AU PARAMETRE** En développement l'application nous avons rapidement ressenti le besoin de pouvoir accéder facilement (c'est à dire de manière static) à des données dépendant de la session (comme les objets sessions et request des jsp et servlet, ou encore à des information sur l'utilisateur connecté).Par exemple dans les divers scripts de gestion des droits, il est nécessaire de connaitre l'identité de l'utilisateur. Pour accéder facilement à ces informations nous ne pouvons pas les mettre en variable static car celles-ci ne dépendent pas de la session. Il devient alors necessaire de propager les objets contenant les informations jusque la fonction finale qui en a réellement besoin. **SCHEMA D ILLUSTRATION** Ceci pose plusieurs grâves problèmes: -ralentissement de l'application (passage de paramètre inutile à certaines fonction); -difficulté de maintenance (multiplication des passages de paramètre); -difficulté de modification et ajout de fonction (car il faut à chaque fois remodifier toutes les fonctions de la chaine) Nous avons donc exprimer le besoin d'avoir des variables static (accessible directement sans faire de passage en paramètre), mais uniquement au niveau du thread, c'est à dire dans notre qui dependent la session (et donc de l'utilisateur)). **SCHEMA DE CE QU ON VEUT** Fonctionnement de la solution Le variables locales à un thread permettent de simuler facilement l'existance d'une variable. En effet un objet ThreadLocal est bien en variable static (donc identique à tout les utilisateurs) mais chaque pour appel get() (pour obtenir une information) réalisé dessus, l'objet identifie le thread faisant l'appel, et renvoie l'information correspondant à ce thread. **SCHEMA BASIC** Utilisation dans Jewie Les Jsp et les servlets utilisent l'objet HttpSession dans lequel peut être stocker plusieurs informations, comme l'identifiant de l'utilisateur. Pour pouvoir partager facilement cet objet nous créons la classe static Http. public class Http { //Attribut static, qui est un objet ThreadLocal private static ThreadLocal httpSession = new ThreadLocal() { @Override public HttpSession initialValue() { return null; } }; //Permet de mettre l'objet HttpSession à partager dans l'objet ThreadLocal public static void setHttpSession(HttpSession session) { httpSession.set(session); } //Permet de récuperer l'objet HttpSession public static HttpSession getHttpSession() { return httpSession.get(); } } En pratique: Dans une servlet ou une Jsp: Http.setHttpSession(request.getSession()); Et utilisation n'importe ou dans le framework: HttpSession currentSession=Http.getHttpSession(); Cela est alors complètement transparent et s'utilise comme un objet static classique. ++++++++++++++++++++++++++++++ Thread: JVM: Singleton: Variables static: Jewie: