Bibliothèques Akka et Java utilisant ThreadLocals

Ce qui m’a empêché d’utiliser Akka régulièrement (en Java), c’est un problème que j’ai avec les bibliothèques qui utilisent ThreadLocals.

C’est-à-dire que certains répartiteurs d’Akka risquent de laisser les variables ThreadLocal ou de les laisser disparaître. La solution évidente serait donc d’éviter d’utiliser ThreadLocals, mais il y a tellement de bibliothèques qui les utilisent: Spring, Wro4j, Log4j, etc etc …

Les ThreadLocals fonctionnent normalement bien dans le conteneur de servlet. En effet, même si les conteneurs ont des pools de threads, la requête correspond principalement à un cycle de vie synchrone. Ainsi, généralement, à la fin d’une requête, des éléments comme Spring et Wro4J nettoient leurs threadlocals. Certains conteneurs comme Tomcat surveillent même les fuites de threadlocal.

D’après ce que j’ai compris, ce n’est pas le cas à Akka.

Comment les gens résolvent-ils ce problème?

Pour l’instant, j’évite simplement d’utiliser Akka et d’utiliser une file de messages (comme RabbitMQ ou ActiveMQ), mais j’aimerais utiliser Akka car il couvre un plus large éventail de problèmes / solutions asynchrones.

Je pense aussi que Netty a des problèmes similaires, mais je pense que Netty propose un object de type Contexte de canal que vous pouvez utiliser à la place de ThreadLocal et, en théorie, certaines bibliothèques peuvent savoir l’utiliser à la place de ThreadLocal.

Le moyen le plus simple de résoudre ce problème consiste à délimiter l’utilisation de ThreadLocals afin de créer une méthode en tant que telle:

def withSecurityContext[T](thunk: => T)(implicit secCtx: SecurityContextFetcher): T = { val old = threadLocalSecurityContext.get threadLocalSecurityContext.set(secCtx.fetch) try thunk finally threadLocalSecurityContext.set(old) } 

Puis à l’intérieur de votre acteur ou quoi:

 class MyActor extends Actor { def receive = { case "foo" => withSecurityContext { beAwesome() } } } 

En général, j’éviterais les ThreadLocals car ils ne s’intègrent pas vraiment dans les systèmes dissortingbués. Ils ne travaillent que dans des sections clairement délimitées.