2010-10-13 13 views
8

Este error aparece a veces en un componente de ámbito de sesión, todavía no he descubierto qué es lo que está causando esto. ¿Algunas ideas?no se pudo adquirir el bloqueo en un componente

ERROR [Exceptions] handled and logged exception 
javax.el.ELException: org.jboss.seam.core.LockTimeoutException: could not acquire lock on @Synchronized component: importUser 

Respuesta

16

Los componentes del ámbito de la sesión están sincronizados por defecto. Eso significa que Seam se ocupa de que solo una solicitud a la vez pueda acceder a dicho componente. Todas las demás solicitudes tienen que esperar hasta que termine la primera. Para evitar la inanición, las solicitudes de espera tienen un tiempo de espera (ver org.jboss.seam.core.SynchronizationInterceptor para la implementación correspondiente). Cuando la solicitud de espera no obtiene acceso al componente hasta que se alcanza el tiempo de espera, el SynchronizationInterceptor arroja un org.jboss.seam.core.LockTimeoutException.

Asumiendo a las solicitudes, A y B, necesita su componente importUser y A es el primero. Si A tarda mucho en finalizar, B terminará en el LockTimeoutException. Para encontrar la causa de su problema, intente averiguar cómo una solicitud al importUser puede tomar más tiempo que el tiempo de espera definido.

+1

Buena respuesta (+1) –

+0

@Arthur ¡Gracias! – kraftan

+0

Esto no ocurre porque hay un comando de ejecución larga, pero parece surgir cuando se lanza una excepción desde este método y está intentando volver a acceder a la misma funcionalidad. – Joe

4

Tenía una página en la que esto ocurría con poca frecuencia bajo una carga pesada. Yo era capaz de reducir la frecuencia de que esto ocurra, poniendo esta anotación en la clase de objeto costura infractor:

@Synchronized(timeout=5000) 

que aumenta el tiempo de espera de cinco segundos en lugar de la opción por defecto segunda costura les da. Es solo una curita, pero no estaba preparado para reescribir ese monstruo.

Cuestiones relacionadas