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