2010-05-25 40 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所说,你需要依靠服务器日志。