2010-10-13 56 views
8

我有時會在會話作用域組件上收到此錯誤,但仍未找出導致此問題失敗的原因。有任何想法嗎?無法獲取組件上的鎖

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

回答

16

默認情況下,會話作用域組件是同步的。這意味着,Seam需要注意一次只有一個請求可以訪問這樣的組件。所有其他請求必須等到第一個完成。爲防止飢餓,等待請求會有一個超時(請參見org.jboss.seam.core.SynchronizationInterceptor以獲得相應的實現)。當等待請求在達到超時時間之前無法訪問組件時,SynchronizationInterceptor將拋出org.jboss.seam.core.LockTimeoutException

假設對請求,A和B,需要您的importUser組件,A是第一個。如果A需要很長時間才能完成,B將在LockTimeoutException結束。要找出問題的原因,請嘗試瞭解對importUser的請求如何花費比定義的超時更長的時間。

+1

不錯的答案(+1) – 2010-10-13 14:16:53

+0

@Arthur謝謝! – kraftan 2010-10-13 20:15:16

+0

這不會發生,因爲有一個長時間運行的命令,但是當從此方法拋出異常並且您試圖重新訪問相同的功能時,似乎會出現這種情況。 – Joe 2010-10-14 03:28:23

4

我有一個頁面,這會在重負載下偶爾發生。我能夠把這個註釋對違規煤層對象類,以減少發生這種情況的頻率:

@Synchronized(timeout=5000) 

這增加了超時五秒鐘,而不是默認的第二接縫給他們。這只是一個創可貼,但我不想重寫那個巨獸。