2013-01-15 82 views
1

在我的EJB中,我使用JCR會話來存儲文件。然後我退出會議併發起CDI事件。觀察CDI事件的EJB然後創建一個新的JCR會話,並在其中使用存儲的文件。 (注意:我必須添加一個延遲才能使其工作,因爲出於某種原因該文件在存儲後不能直接使用)。在使用該文件完成該方法之後,我也註銷該會話。然而在15分鐘後,我得到了一個例外:「在關閉之後試圖關閉session-a84d60ac-1c8f-4cad-bc5a-84102b12f8e5-385」。與堆棧跟蹤:由容器關閉的JCR會話導致重複嘗試關閉會話

Stack trace of the duplicate attempt to close session-c7bc3b30-9a5f-4922-bf80-8f197c583370-389 
at org.apache.jackrabbit.core.session.SessionState.close(SessionState.java:280) ~[jackrabbit-core-2.4.2.jar:na] 
at org.apache.jackrabbit.core.SessionImpl.logout(SessionImpl.java:943) [jackrabbit-core-2.4.2.jar:na] 
at org.apache.jackrabbit.core.XASessionImpl.logout(XASessionImpl.java:392) [jackrabbit-core-2.4.2.jar:na] 
at org.apache.jackrabbit.jca.JCAManagedConnection.cleanup(JCAManagedConnection.java:169) [jackrabbit-jca-2.4.2.jar:na] 
at ... 

和1小時後:

Unclosed session detected. The session was opened here: java.lang.Exception: Stack Trace 
at org.apache.jackrabbit.core.SessionImpl.<init>(SessionImpl.java:222) ~[jackrabbit-core-2.4.2.jar:na] 
at org.apache.jackrabbit.core.SessionImpl.<init>(SessionImpl.java:239) ~[jackrabbit-core-2.4.2.jar:na] 
at org.apache.jackrabbit.core.XASessionImpl.<init>(XASessionImpl.java:99) ~[jackrabbit-core-2.4.2.jar:na] 
at ... 

我相信這是因爲應用服務器(Glassfish的v.3.1.2.2)試圖關閉我已經關閉了會議。但是,當我不關閉任何會話時,我也會遇到異常,說明已達到池大小限制。我怎樣才能避免我的問題?

+0

您是否嘗試跨線程使用會話?你是否將會話傳遞給其他方法,這些方法也試圖關閉它?可能值得仔細檢查你的代碼,以確保不會發生。此外,「我不得不延遲」,這是一個非常糟糕的代碼味道。解決問題,而不是症狀。 – TedTrippin

回答

0

看起來你在XA交易中使用Jackrabbit。

我和JBoss有類似的問題,我通過使用與我的EJB不同的非XA數據源解決了這個問題。 深入瞭解更多信息: http://jackrabbit.510166.n4.nabble.com/How-to-handle-XA-Transactions-td521875.html

+0

那麼使用本地事務應該可以工作嗎?或者我必須改變我的repository.xml的配置中的東西?我想我記得在本地交易中嘗試了這一點,並得到同樣的錯誤,但我不確定。我會在當天晚些時候嘗試,並讓本地事務知道 – nico1510

+0

我收到以下錯誤:系統異常com.sun.appserv.connectors.internal.api.PoolingException:java.lang.UnsupportedOperationException:com不支持本地事務.sun.enterprise.resource.ConnectorXAResource.getResourceHandle(ConnectorXAResource.java:255)at com.sun.enterprise.resource.ConnectorXAResource.resetAssociation(ConnectorXAResource.java:266)at ...我該做什麼? – nico1510

+0

你是如何在Glassfish中部署你的倉庫的?它看起來像它被部署爲服務器中的資源。你有沒有在他們的wiki上看過這個頁面(http://wiki.apache.org/jackrabbit/JackrabbitOnJBoss?highlight=%28transaction%29),它有一個關於如何從會話bean中使用它的例子。 – ehsavoie