2010-10-13 20 views
8

Ich bekomme diesen Fehler manchmal auf einer Sitzung Bereich Komponente, immer noch nicht herausgefunden, was verursacht dies zu scheitern. Irgendwelche Ideen?konnte Sperre für eine Komponente nicht erhalten

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

Antwort

16

Komponenten mit Sitzungsumfang werden standardmäßig synchronisiert. Das heißt, Seam sorgt dafür, dass immer nur eine Anfrage auf eine solche Komponente zugreifen kann. Alle anderen Anfragen müssen warten, bis der erste fertig ist. Um das Verhungern zu verhindern, haben die wartenden Anfragen ein Timeout (siehe für die entsprechende Implementierung). Wenn die wartende Anforderung nicht auf die Komponente zugreift, bis die Zeitüberschreitung erreicht ist, löst die SynchronizationInterceptor eine org.jboss.seam.core.LockTimeoutException aus.

Angenommen, Anforderungen A und B, benötigen Sie Ihre importUser Komponente und A ist zuerst. Wenn A viel Zeit benötigt, um zu beenden, endet B in LockTimeoutException. Versuchen Sie herauszufinden, wie eine Anforderung an importUser länger als das definierte Zeitlimit dauern kann, um die Ursache Ihres Problems zu finden.

+1

Schöne Antwort (+1) –

+0

@Arthur Danke! – kraftan

+0

Dies passiert nicht, weil ein langer Ausführungsbefehl vorhanden ist, der jedoch erscheint, wenn eine Ausnahme von dieser Methode ausgelöst wird und Sie versuchen, auf die gleiche Funktionalität zuzugreifen. – Joe

4

Ich hatte eine Seite, wo dies selten unter schwerer Last passieren würde. Ich konnte die Frequenz dieses auftritt, reduzieren, indem sie diese Anmerkung auf der säumige Seam Objektklasse setzen:

@Synchronized(timeout=5000) 

, dass das Timeout auf fünf Sekunden anstelle des Standard-1 Sekunde Seam gibt ihnen erhöht. Es ist nur ein Pflaster, aber ich wollte dieses Ungetüm nicht umschreiben.

Verwandte Themen