2011-04-03 12 views
5

Tengo una aplicación de servidor cliente multi-hilos que usa Sockets. Cuando se encuentra una nueva conexión, la ejecución adicional se transfiere a un nuevo subproceso utilizando el nuevo grupo de subprocesos de ejecutores.Thread.setName (name) advertencias

Quiero registrar el ID del cliente en todas las instrucciones de registro para ese cliente. El problema es que no quiero modificar las firmas de métodos solo para pasar la identificación del cliente.

Las soluciones que pensé que de son:

  1. Usando ThreadLocal para mantener el valor del cliente.
  2. En run(), puedo establecer el ID del cliente en Thread usando Thread.currentThread(). SetName (clientId);

Primero uno debería funcionar. Pero me gusta la segunda opción porque a. Puedo encontrar la identificación del cliente del depurador b. La biblioteca del registrador se puede configurar para mostrar el nombre del hilo. Por lo tanto, no se requerirían cambios en las instrucciones de registro y también funcionaría para los registradores dentro de las bibliotecas.

¿Cuáles son las advertencias para usar thread.setName() aparte de las mencionadas en el javadoc? ¿Cómo afecta el rendimiento? La frecuencia máxima de la llamada a thread.setName() sería de aproximadamente 200 por segundo y promedia aproximadamente 0.3 por segundo.

Respuesta

3

Si utiliza Log4j, hay un mecanismo específico para manejar este tipo de patrón de registro, dividido entre dos clases org.apache.log4j.NDC y org.apache.log4j.MDC ('Contextos de diagnóstico anidados y asignados').

Mire en NDC vs MDC - Which one should I use? para ver cuál es el mejor para usar en su situación particular.

Aquí hay otro enlace que describe el uso del MDC en detalle un poco más práctico: Build Flexible Logs With log4j - O'Reilly Media

Tenga en cuenta que el mecanismo de almacenamiento subyacente MDC/usos NDC (creo) es ThreadLocal de todos modos.

+0

Esto se ve bien. Lo intentaré. ¡Gracias! – Dojo

1

Utilizo su segundo enfoque en un software desarrollado (servidor de impresión), pero los hilos tienen un largo recorrido por lo que "setName()" no agrega latencia en el procesamiento. La fase de inicio de sesión es muy buena mostrando el nombre de la secuencia.

creo "setName()" es un Problema en dos casos:

  1. muy corto plazo;
  2. hilo utilizado por más actores con ID diferente (pero este no es su contexto, ¿o no?).

bye.

+0

Gracias por sus entradas @ m.genova – Dojo

2

¿Cuáles son las advertencias para usar thread.setName() aparte de las mencionadas en el javadoc? ¿Cómo afecta el rendimiento? La frecuencia máxima de la llamada a thread.setName() sería de aproximadamente 200 por segundo y promedia aproximadamente 0.3 por segundo.

El rendimiento no debería ser un problema importante. Thread.setName() realiza una comprobación de seguridad y luego copia/establece un atributo. El control de seguridad debe ser económico, a menos que su código sea un código privilegiado que se ejecuta en un entorno limitado de seguridad que prohíbe las llamadas sin privilegios al método Thread.setName().

La única otra advertencia que puedo pensar es que los nombres de subprocesos cambian todo el tiempo podrían ser confusos si está intentando depurar el comportamiento del subprocesamiento; p.ej. mirando volcados de hilo, etc.

+0

Sí, no noté ninguna sobrecarga significativa durante las pruebas. – Dojo