problema ThreadLocal ejecuta en contenedor Tomcat propensos

ciclo de vida ThreadLocal Tomcat contenedor no significa ciclo de vida solicitud web, por lo que (se discute más adelante contenedor Tomcat se utiliza ThreadLocal), por lo ThreadLocal no debe ser guardado y afectará a la petición de la información relevante.

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("threadLocalRunInTomcatTest")
public class ThreadLocalRunInTomcatTestController {

    private static final ThreadLocal<String> currentUserId = ThreadLocal.withInitial(() -> null);

    @GetMapping("fail")
    public String fail(@RequestParam("uid") String uid) {
        String before  = Thread.currentThread().getName() + ":" + currentUserId.get();
        currentUserId.set(uid);
        String after  = Thread.currentThread().getName() + ":" + currentUserId.get();
        return before+"\n"+after;
    }

    @GetMapping("success")
    public String success(@RequestParam("userId") String userId) {
        String before  = Thread.currentThread().getName() + ":" + currentUserId.get();
        currentUserId.set(userId);
        try {
            String after = Thread.currentThread().getName() + ":" + currentUserId.get();
            return before+"\n"+after;
        } finally {
            currentUserId.remove();
        }
    }
}

Las solicitudes no pasan la primera prueba:
currentUserId se utiliza para almacenar clave única del usuario actual,
la primera petición 127.0.0.1:1003/threadLocalRunInTomcatTest/fail?uid=2
resultados de retorno como:
HTTP-NiO-1003-Exec-1: nula
HTTP-NiO-1003 - Exec. 1: 2
en este momento es el resultado;

127.0.0.1:45678/threadLocalRunInTomcatTest/fail?uid=3 segunda petición
(el UID para el valor 3)
Resultados:
HTTP-NiO-45678-Exec 1-:. 2
. HTTP-NiO-45678-Exec 1-: 3

Análisis:
Nos devuelve el formato de los datos es: vuelta antes + "\ n" + después,
por lo que la primera vez, antes es nulo, después de 2
en segundo lugar, antes de a 2, después de las tres.
Aparente, solicitud web ciclo diferente del ciclo de ThreadLocal; esto es demasiado caro debido a que la creación del hilo, la reutilizado. Después de conocer la razón, puede eliminar los datos al final de localthread añadir un quite.

Solicitar una prueba del éxito:
127.0.0.1:45678/threadLocalRunInTomcatTest/success?userId=2

No importa cuántas veces la solicitud, cada vez que regresó:
HTTP-NiO-45678-Exec-1: null
HTTP-NiO-45678-Exec-1: 2

Liberadas dos artículos originales · ganado elogios 1 · vistas 13

Supongo que te gusta

Origin blog.csdn.net/qq_24510649/article/details/105013382
Recomendado
Clasificación