14 votes

Utilisation de ThreadLocal dans une application d'entreprise

Si mon application web et mon application ejb sont sur la même machine (sur la même JVM) et que tous les appels ejb sont des appels locaux, est-ce que l'utilisation de ThreadLocal Y a-t-il un problème lors du passage des informations du web à l'ejb ?

Y a-t-il une solution si les appels ejb sont distants ? La volonté ThreadLocal Les informations sont-elles disponibles entre l'application web et l'application ejb ? L'utilisation de ThreadLocal est-il conseillé dans un tel scénario ?

14voto

pgras Points 7202

Pour la première question, il n'y a pas de problème tant que vous supprimez les variables ThreadLocal à la fin de chaque appel. Ceci est important car les conteneurs (servlet ou ejb) utilisent généralement des threadpools et réutilisent donc des threads, ce qui a deux effets : un "appel" peut voir des informations threadlocal provenant d'un appel précédent, et si vous retirez une application du conteneur sans arrêter la JVM, certaines classes peuvent ne pas être ramassées car elles sont toujours référencées par un thread du conteneur. Il faut donc placer les données dans un threadlocal dans un bloc try / finally et les supprimer dans la partie finally.

Voici un billet montrant une façon de résoudre le problème : ThreadLocal dans les applications web

Pour la deuxième question, comme les données sont locales au fil de l'eau, elles ne viendront pas avec un appel à distance, vous devez ajouter un paramètre à vos interfaces, extraire les données locales au fil de l'eau d'un côté et les recréer de l'autre côté...

3voto

SpaceTrucker Points 2897

Lorsque vous utilisez EJB 3.1, vous pouvez transmettre des informations contextuelles dans la balise EJBContext en utilisant son données contextuelles . Il ne s'agit que d'une Map<String,Object> .

3voto

Soccertrash Points 811

ThreadLocal ne doit pas être utilisé dans les contextes EJB. Il n'est pas possible de garantir que les invocations de méthodes EJB se déroulent toutes sur le même fil d'exécution (bien entendu, elles devraient l'être).

Dans l'EJB, l'approche est différente : il s'agit d'appeler TransactionSyncrhonizationRegistry (registre de synchronisation des transactions) . Voir Explication/Utilisation pour plus de détails.

2voto

Anton Points 2215

tous les appels ejb sont des appels locaux, l'utilisation de ThreadLocal va-t-elle créer une un problème lors de l'utilisation de

Non, vous avez répondu vous-même à votre question. Les appels étant locaux, ils sont exécutés dans le contexte d'un seul thread.

Y a-t-il une solution si les appels ejb sont distants ?

Dans le cas d'appels à distance, le conteneur Java EE sera exécuté dans une autre JVM, il créera ses propres threads pour traiter les demandes RMI entrantes, il n'y a aucun moyen pour un conteneur Java EE distant de connaître les variables locales des threads qui ont été déclarées de l'autre côté. Transmettez-le en tant qu'objet paramètre.

0voto

JeanValjean Points 3518

Cela dépend des informations que vous transmettez ! La première question est trop générique. Je vous suggère de lire la JavaDoc relative à ThreadLocal aquí .

ThreadLocal se trouve du côté serveur de l'application et est utilisé pour sécuriser les appels de vos objets Thread.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X