Сообщение об исключении потеряно в IIOP между доменами GlassFish

StackOverflow https://stackoverflow.com/questions/2903938

  •  04-10-2019
  •  | 
  •  

Вопрос

Я запускаю два домены V2 GlassFish v2, содержащие EJBS без гражданства. В некоторых случаях 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, у которого была проблема.

Звучит как получение большего количества информации с другого конца, может быть трудно ... Я не знаю, какой трекер выпуска будет правой для информации, потерянной, когда ApplicationException создается / брошен.

Общий взлом будет создать набор пользовательских классов исключения в проекте, который имеет неудачу EJB. Вы бы сделали их очень хорошо, зернистыми, чтобы покрыть вероятные причины проблемы и обеспечить достаточно подробное описание, чтобы идентифицировать фактическое местоположение проблемы. Yucky ... но это может быть единственным выбором, пока проблема не будет подана, и исправление распределяется.

Здесь есть что я могу сделать, чтобы сохранить информацию о фактической причине проблемы?

К сожалению нет. ORB не использует обычную сериализацию объекта для системных исключений (т. Е. org.omg.corba. *), Что означает, что причины теряются. Как сказал @vkraemer, вам нужно будет полагаться на журналы сервера.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top