Pregunta

He escrito un sistema de autorización que se basa en objetos que representan al usuario actual.Para simplificar la programación y aumentar el rendimiento, quiero mantener esos objetos en un ThreadLocal después de que el usuario haya iniciado sesión.

Se parece a esto:

public class UserCache {

    private static final ThreadLocal<User> cache = new ThreadLocal<User>();

    public User getCurrentUser() {
        return cache.get();
    }

    public void setCurrentUser(User user) {
        cache.set(user);
    }

}

He leído que los elementos estáticos hacen que la agrupación en clústeres sea problemática.Si tenía un UserCache en cada nodo del clúster, todos tenían su propio objeto de caché no sincronizado con los objetos de caché de otros nodos.¿Bien? UserCache es un candidato clásico para un singleton, porque la aplicación solo necesita una instancia del mismo.Pero hasta donde yo sé, los EJB @Singleton tienen el mismo comportamiento en un clúster.

Entonces, ¿qué hacer para que UserCache se pueda agrupar en un entorno EJB 3.1 (Java EE 6)?

Soluciones extraídas de las respuestas:

  • Usando SessionScope desde CDI (JSR 299) o
  • Uso de agrupación en clústeres JVM con Terracotta
¿Fue útil?

Solución

Dado que ya se encuentra en Java EE 6, ¿no incluso ser mucho más fácil de usar CDI (Contextos y la inyección de dependencias). Esto permitiría a poner la información del usuario en el ámbito de sesión , e inyectarlo fácilmente en todas partes. CDI gestiona el resto para usted.

Otros consejos

Eso no debería causarle un problema, porque los subprocesos no abarcan diferentes nodos de todos modos, ¿o me estoy perdiendo el sentido de su pregunta?

editar :es posible que quieras buscar algo como terracota. http://www.terracota.org/ - para conocer formas de agrupar objetos existentes

Si necesita compartir objetos entre los nodos, yo también os recomiendo mirar los marcos existentes (como terracota).

Además, el uso ThreadLocal, posiblemente, podría causar problemas diferentes:

http://forums.sun.com/thread.jspa?threadID=589744 http://www.devwebsphere.com/devwebsphere/2005/06/dont_use_thread. html http://www.theserverside.com/discussions/thread.tss?thread_id= 21055

Esto no puede ser un problema aquí, sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top