异常消息在玻璃鱼域之间的IIOP中丢失
题
我正在运行两个玻璃鱼V2域,其中包含无状态会话EJB。在少数情况下,一个域中的EJB必须在另一个域中呼叫一个。
我的问题是,当呼叫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)
我在这里可以做些什么来保留有关问题的实际原因的信息?
解决方案 3
我终于到了底部:实际上,Glassfish通过IIOP非常正确地传输了异常,一切都应该...除非您做一些像这样的愚蠢的事情:
try{
ejb.getFoo();
}catch (Exception e){
// try again
ejb.getFoo();
}
是的,正是我们自己的该死的代码吞没了例外,并试图在分布式交易中调用一种要求交易的EJB方法,该方法由于例外而被退回。
其他提示
问题的原因应在托管具有问题的EJB的域的服务器日志中可用。
听起来像是从另一端获取更多信息可能很困难...我不知道在创建/投掷应用程序Exception时,哪个问题跟踪器是正确的信息。
一个总的黑客攻击是在项目中创建一组具有EJB失败的自定义异常类。您将使它们非常细化,以涵盖问题的可能原因,并在其名称中提供足够的细节,以确定问题的实际位置。令人讨厌...但这可能是唯一的选择,直到提出问题并分发了解决方案为止。
我在这里可以做些什么来保留有关问题的实际原因的信息?
很不幸的是,不行。 ORB不将正常对象序列化用于系统异常(即,org.omg.corba。*),这意味着原因丢失了。正如@vkraemer所说,您需要依靠服务器日志。
不隶属于 StackOverflow