2010-05-25 44 views
1

我正在運行兩個包含無狀態會話EJB的glassfish v2域。在少數情況下,一個域中的EJB必須在另一個域中調用一個。在glassfish域之間的IIOP中丟失的異常消息

我的問題是,當被調用的EJB異常中止時,調用者不會收到異常的消息,而是報告一個內部錯誤,在診斷問題時根本沒有任何幫助。發生什麼似乎是這樣的:

  • 在傳輸層,創建了一個org.omg.CORBA.portable.ApplicationException,它已經失去了除該類以外的所有異常的詳細信息。
  • com.sun.jts.CosTransactions.TopCoordinator.get_txcontext(),交易屁股的狀態回滾導致org.omg.CosTransactions.Unavailable被拋出,其中被包裹和周圍幾次通過並最終導致這個錯誤顯示給用戶:

    org.omg.CORBA.INVALID_TRANSACTION: vmcid: 0x0 minor code: 0 completed: No 
    at com.sun.jts.CosTransactions.CurrentTransaction.sendingRequest(CurrentTransaction.java:807) 
    at com.sun.jts.CosTransactions.SenderReceiver.sending_request(SenderReceiver.java:139) 
    at com.sun.jts.pi.InterceptorImpl.send_request(InterceptorImpl.java:344) 
    at com.sun.corba.ee.impl.interceptors.InterceptorInvoker.invokeClientInterceptorStartingPoint(InterceptorInvoker.java:271) 
    at com.sun.corba.ee.impl.interceptors.PIHandlerImpl.invokeClientPIStartingPoint(PIHandlerImpl.java:348) 
    at com.sun.corba.ee.impl.protocol.CorbaClientRequestDispatcherImpl.beginRequest(CorbaClientRequestDispatcherImpl.java:284) 
    at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.request(CorbaClientDelegateImpl.java:184) 
    at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:186) 
    at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152) 
    at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225) 
    

有什麼我可以在這裏做的,以保存有關問題的實際原因的信息?

回答

0

我終於到這條底線:其實,Glassfish的非常正確傳送通過IIOP異常,一切正常,因爲它應該...除非你做這樣愚蠢的事:

try{ 
    ejb.getFoo(); 
}catch (Exception e){ 
    // try again 
    ejb.getFoo(); 
} 

啊,這是我們自己的該死的代碼吞噬了異常,並試圖在分佈式事務中調用一個事務需求的EJB方法,該事務由於異常而回滾了。

1

問題的原因應該在承載有問題的EJB的域的服務器日誌中可用。

聽起來好像從另一端獲得更多信息可能很困難......我不知道哪個問題跟蹤器會在創建/拋出ApplicationException時丟失信息。

總的來說,就是在ejb失敗的項目中創建一組自定義異常類。你會讓它們非常細緻,以涵蓋問題的可能原因,並提供足夠的細節來確定問題的實際位置。 Yucky ...但這可能是唯一的選擇,直到一個問題被提交併且修復被分發。

1

有什麼我可以在這裏做到的 保存有關實際 問題的原因?

不幸的是,沒有。對於系統異常(即org.omg.CORBA。*),ORB不使用正常的對象序列化,這意味着原因會丟失。正如@vkraemer所說,你需要依靠服務器日誌。