2008-11-26 8 views
6

¿Las variables threadlocals son globales para todas las solicitudes realizadas al servlet que posee las variables?threadlocal variables en un servlet

Estoy usando resina para el servidor.

Gracias por su atención.

Creo que puedo hacer mi auto más claro.

el caso específico:

Quiero:

  • inicializar una variable estática cuando la solicitud se inicia la ejecución.
  • poder consultar el valor de la variable en las nuevas ejecuciones de métodos llamados desde el servlet de una manera hilo de seguridad hasta que la solicitud termina la ejecución

Respuesta

3

creo que son globales para todas las solicitudes realizadas con ese hilo específico solo. Otros subprocesos obtienen otras copias de thread-local de datos. Este es el punto clave del almacenamiento local de subprocesos: http://en.wikipedia.org/wiki/Thread-local_storage#Java.

A menos que marque la opción correspondiente en la configuración de servlets, el contenedor de servlets usará su servlet con varios subprocesos para manejar solicitudes en paralelo. Entonces, efectivamente, tendrías datos separados para cada hilo que esté sirviendo a los clientes.

Si su aplicación web no está distribuida (se ejecuta en varias máquinas virtuales Java), puede usar el objeto ServletContext para almacenar datos compartidos entre solicitudes e hilos (asegúrese de realizar el bloqueo adecuado en ese momento).

+0

De hecho. En un proyecto anterior, almacené un ticket de usuario en su sesión y creé un filtro para transferir el ticket de la sesión a un hilo local para asegurarme de que el estado de autenticación del usuario estuviera siempre disponible para el hilo que procesa la solicitud. – Julie

0

Las variables Threadlocal siempre se definen para ser accedidas globalmente, ya que el punto es pasar información de forma transparente alrededor de un sistema al que se puede acceder desde cualquier lugar. El valor de la variable está vinculado al hilo en el que está establecido, de modo que aunque la variable sea global, puede tener diferentes valores según el hilo desde el que se acceda.

Un ejemplo simple sería asignar una cadena de identidad de usuario a un subproceso en una variable local de subproceso cuando la solicitud se recibe en el servlet. En cualquier lugar a lo largo de la cadena de procesamiento de esa solicitud (suponiendo que esté en el mismo hilo en la misma máquina virtual), la identidad se puede recuperar accediendo a esta variable global. También sería importante eliminar este valor cuando se procese la solicitud, ya que el hilo se volverá a colocar en un grupo de subprocesos.

2

Como dice Adiel, la forma correcta de hacerlo es, probablemente, utilizar el contexto de solicitud (es decir, HttpServletRequest), no crear un ThreadLocal. Si bien es cierto que es posible utilizar un ThreadLocal aquí, debes tener cuidado de limpiar tu hilo si lo haces, ya que de lo contrario la próxima solicitud que obtenga el hilo verá el valor asociado con la solicitud anterior. (Cuando se realiza la primera solicitud con el hilo, el hilo volverá al grupo y entonces la próxima solicitud lo verá). No hay razón para tener que gestionar ese tipo de cosas cuando el contexto de solicitud existe precisamente para este propósito.

+0

También podría usar un filtro de servlet para administrar ThreadLocal, al menos la creación/limpieza estaría en un solo lugar. – sehugg

+1

-1 Definitivamente hay una buena razón para "gestionar ese tipo de cosas", hay una diferencia entre pasar un argumento 1000 veces alrededor de su aplicación, en comparación con solo tener un getter estático ;-) – peenut

+1

No entiendo su comentario peenut. Mi respuesta no tiene nada que ver con pasar un argumento alrededor de 1,000 veces o un getter estático. En cambio, se trata de elegir entre el uso del almacenamiento ThreadLocal y HttpServletRequest como contexto para las solicitudes HTTP. Dado que el OP desea que los enlaces duren mientras dura la solicitud, el contexto adecuado es el HSR (ciclo de vida coincidente con la solicitud), no un ThreadLocal (compartido entre solicitudes ya que los hilos de trabajo generalmente se agrupan). HSR le permite evitar limpiar el contexto ya que se descarta al final de la solicitud. –

4

Respuesta corta: Sí.
Un poco más largo: así es como Spring hace su magia. Ver RequestContextHolder (a través de DocJar).

Sin embargo, es necesario tener precaución: debe saber cuándo invalidar el ThreadLocal, cómo diferir a otros hilos y cómo (no) enredarse con un contexto no threadlocal.

O usted podría utilizar primavera ...

+0

+1 respuesta al punto! – peenut

1

Usando ThreadLocal para almacenar ámbito de petición de información tiene el potencial de romper si se utiliza Servlet 3.0 suspendibles peticiones (o embarcadero continuaciones) El uso de múltiples hilos de los API procesar una sola solicitud.