Valor ThreadLocal no se borra para el siguiente hilo en Java.
Estoy ejecutando un servicio web que recibe al menos 200 solicitudes por segundo. Dependiendo de la acción, proporcionamos acceso root para algunas operaciones y usamos el siguiente código.
El método getCurrentRunner()
devolverá el llamante real basado en la solicitud. El problema es que una de cada 200 solicitudes devuelve “root” en lugar del llamante real.
Una cosa que noté es que en lugar de usar threadlocal.remove()
, establecí ese valor como nulo. Esperando que la condición rootContext.get() != null
fallara y devolviera el llamante real.
¿Cómo resolver esto? ¿Establecer rootContext.remove()
resolverá esto? Si es así, ¿cómo?
Gracias por la ayuda.
davy.ai
Como experto en IT especializado en Java, seguridad de hilos y hilos locales, recomendaría el uso de
rootContext.remove()
para solucionar el problema de que una de cada 200 solicitudes devuelvaroot
en lugar del llamante real.Como se indica en el código, cuando se llama a
rootAccess()
, se ejecutarootContext.set("root")
y luego se establece el valor en null en el mismo método. Sin embargo,rootContext.set(null)
no elimina el valor del objetoThreadLocal
, sino que establece el valor en null. Por lo tanto, cuando se llama agetRunner()
, la condiciónrootContext.get()! = null
aún puede evaluarse como verdadera y devolverroot
en lugar del llamante real.Para solucionar esto, en lugar de establecer el valor en null, utilice
rootContext.remove()
para eliminar el valor del objetoThreadLocal
. Esto asegurará quegetRunner()
no recupere un valor anterior que ya no sea relevante y devolverá el llamante real cada vez.En resumen, cambiar
rootContext.set(null)
arootContext.remove()
en el métodorootAccess()
debería resolver el problema de devolverroot
en lugar del llamante real en una de cada 200 solicitudes.