1

我正在运行两个包含无状态会话 EJB 的 glassfish v2 域。在少数情况下,一个域中的 EJB 必须调用另一个域中的 EJB。

我的问题是,当被调用的 EJB 异常中止时,调用者没有收到异常消息,而是报告了一个对诊断问题毫无帮助的内部错误。发生的事情似乎是这样的:

  • 在传输层,org.omg.CORBA.portable.ApplicationException创建了 a,它已经丢失了除其类之外的异常的所有详细信息。
  • 在内部com.sun.jts.CosTransactions.TopCoordinator.get_txcontext(),事务 assroll back 的状态导致 aorg.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)
    

我可以在这里做些什么来保存有关问题实际原因的信息吗?

4

3 回答 3

1

问题的原因应该可以在托管有问题的 EJB 的域的服务器日志中找到。

听起来从另一端获取更多信息可能很困难......我不知道哪个问题跟踪器适合创建/抛出 ApplicationException 时丢失的信息。

一个完整的技巧是在具有失败的 ejb 的项目中创建一组自定义异常类。您将使它们变得非常细化以涵盖问题的可能原因,并在其名称中提供足够的详细信息以识别问题的实际位置。糟糕……但这可能是在提交问题并分发修复程序之前的唯一选择。

于 2010-05-27T15:38:01.200 回答
1

我可以在这里做些什么来保存有关问题实际原因的信息吗?

很不幸的是,不行。ORB 不对系统异常(即org.omg.CORBA.*)使用正常的对象序列化,这意味着原因丢失了。正如@vkraemer 所说,您需要依赖服务器日志。

于 2010-05-28T18:18:10.193 回答
0

我终于明白了这一点:实际上,Glassfish 通过 IIOP 非常正确地传输异常,并且一切正常......除非你做这样的愚蠢的事情:

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

是的,是我们自己的该死的代码吞下了异常,并试图在一个分布式事务中调用一个需要事务的 EJB 方法,该分布式事务由于异常而被回滚。

于 2010-06-24T07:38:19.613 回答