【问题标题】:exception message getting lost in IIOP between glassfish domains异常消息在 glassfish 域之间的 IIOP 中丢失
【发布时间】:2010-05-25 10:56:35
【问题描述】:

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

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

  • 在传输层创建了一个org.omg.CORBA.portable.ApplicationException,它已经丢失了除其类之外的异常的所有详细信息。
  • com.sun.jts.CosTransactions.TopCoordinator.get_txcontext() 内部,事务ass 回滚的状态会导致org.omg.CosTransactions.Unavailable 被抛出,该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)
    

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

【问题讨论】:

    标签: glassfish ejb-3.0 corba iiop


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      有什么我可以做的吗? 保留有关实际的信息 问题的原因?

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2015-11-18
          • 2017-02-14
          • 1970-01-01
          • 2022-01-10
          • 1970-01-01
          • 2019-06-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多