我正在运行两个玻璃鱼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所说,您需要依靠服务器日志。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top