EJB 2.1 выбрасывает удаленное исключение в кластере

Мы работаем над переносом приложения Weblogic 10.3.6 на Weblogic 12.2.1.2. У нас есть много bean-компонентов EJB 2.1, которые составляют часть приложения. У нас возникла странная проблема с некоторыми из этих бобов.

Когда у нас есть 1 ejb, вызывающий другой, и этот bean-компонент выдает проверенное исключение (например, RuleException extends Exception), это выдается как RemoteException (RemoteEJBInvokeException). Это происходит только в том случае, если приложение работает в кластере. Если я развертываю против автономного jvm, он работает нормально.

Общий шаблон EJB - это шаблон фасада. В компоненте Facade мы используем стандартный поиск JNDI, чтобы найти Home, а затем запускаем метод create, чтобы вернуть бизнес-интерфейс / impl

InitialContext ctx = new InitialContext();
ReportManagementHome reportManagementHome = (ReportManagementHome) ctx.lookup("ReportManagement");
ReportManagement reportManagement = reportManagementHome.create();

ReportManagement bean запускает бизнес-логику и генерирует RuleException.

Это пример метода фасада, который вызывает второй компонент:

public String doTest() {
    String s = null;
    try
    {
      s = reportManagement.doValidate();
    }
    catch ( RuleException re )
    {
      rollBack();
    } catch (RemoteException e)
    {
      e.printStackTrace();
    }

    return s;
  }

Вот метод doValidate() во втором компоненте:

public String doValidate( )
      throws RuleException, CustomException
  {

    int test = 1;

    if (test == 1)
    {
      throw new RuleException();
    }

    return "Hello";

  }

Хотя RuleException правильно достают и бросают, к тому времени, когда фасад ловит его, это RemoteException.

Это пример списка ejbs / интерфейсов:

ReportManagement
ReportManagementBean
ReportManagementFacade
ReportManagementFacadeBean
ReportManagementFacadeHome
ReportManagementFacadeLocal
ReportManagementFacadeLocalHome
ReportManagementHome
ReportManagementLocal
ReportManagementLocalHome

Вот ejb-jar.xml

    <?xml version='1.0' encoding='UTF-8'?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"
         version="2.1">
<enterprise-beans>
    <session>
      <display-name>ReportManagementFacade</display-name>
      <ejb-name>ReportManagementFacade</ejb-name>
      <home>com.ejb.ReportManagementFacadeHome</home>
      <remote>com.ejb.ReportManagementFacade</remote>
      <local-home>com.ejb.ReportManagementFacadeLocalHome</local-home>
      <local>com.ejb.ReportManagementFacadeLocal</local>
      <ejb-class>com.ejb.ReportManagementFacadeBean</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
    </session>
    <session>
      <display-name>ReportManagement</display-name>
      <ejb-name>ReportManagement</ejb-name>
      <home>com.ejb.ReportManagementHome</home>
      <remote>com.ejb.ReportManagement</remote>
      <local-home>com.ejb.ReportManagementLocalHome</local-home>
      <local>com.ejb.ReportManagementLocal</local>
      <ejb-class>com.ejb.ReportManagementBean</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
    </session>
  </enterprise-beans>
  <assembly-descriptor>
    <container-transaction>
      <method>
        <ejb-name>ReportManagementFacade</ejb-name>
        <method-name>*</method-name>
      </method>
      <trans-attribute>Required</trans-attribute>
    </container-transaction>
    <container-transaction>
      <method>
        <ejb-name>ReportManagement</ejb-name>
        <method-name>*</method-name>
      </method>
      <trans-attribute>Required</trans-attribute>
    </container-transaction>
  </assembly-descriptor>
</ejb-jar>

Вот файл weblogic-ejb-jar.xml

    <?xml version='1.0' encoding='UTF-8'?>
<weblogic-ejb-jar xmlns="http://xmlns.oracle.com/weblogic/weblogic-ejb-jar"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-ejb-jar http://xmlns.oracle.com/weblogic/weblogic-ejb-jar/1.2/weblogic-ejb-jar.xsd">
  <weblogic-enterprise-bean>
    <ejb-name>ReportManagementFacade</ejb-name>
    <jndi-name>Destin8.ejb.reportmanagement.ReportManagementFacade</jndi-name>
    <local-jndi-name>Destin8.ejb.reportmanagement.ReportManagementFacadeLocal</local-jndi-name>
    <enable-call-by-reference>true</enable-call-by-reference>
  </weblogic-enterprise-bean>
  <weblogic-enterprise-bean>
    <ejb-name>ReportManagement</ejb-name>
    <jndi-name>Destin8.ejb.reportmanagement.ReportManagement</jndi-name>
    <local-jndi-name>Destin8.ejb.reportmanagement.ReportManagementLocal</local-jndi-name>
    <enable-call-by-reference>true</enable-call-by-reference>
  </weblogic-enterprise-bean>
  <weblogic-compatibility>
    <entity-always-uses-transaction>true</entity-always-uses-transaction>
  </weblogic-compatibility>
</weblogic-ejb-jar>

А вот и StackTrace:

weblogic.rmi.RemoteEJBInvokeException: null; nested exception is: 
    com.exception.RuleException
    at weblogic.ejb.container.internal.SessionRemoteMethodInvoker.invoke(SessionRemoteMethodInvoker.java:27)
    at com.ejb.ReportManagement_tq6u66_EOImpl.doLUMValidate(Unknown Source)
    at com.ejb.ReportManagementFacadeBean.doLUM(ReportManagementFacadeBean.java:82)
    at com.ejb.ReportManagementFacade_sidvua_EOImpl.__WL_invoke(Unknown Source)
    at weblogic.ejb.container.internal.SessionRemoteMethodInvoker.invokeInternal(SessionRemoteMethodInvoker.java:54)
    at weblogic.ejb.container.internal.SessionRemoteMethodInvoker.invoke(SessionRemoteMethodInvoker.java:21)
    at com.ejb.ReportManagementFacade_sidvua_EOImpl.doLUM(Unknown Source)
    at com.ajf.Page1ManagedBean.refreshDate(Page1ManagedBean.java:105)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.sun.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:181)
    at com.sun.el.parser.AstValue.invoke(AstValue.java:289)
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    at javax.faces.component.UICommand.broadcast(UICommand.java:315)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:650)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:286)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:260)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:137)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:350)
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78)
    at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:32)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3683)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3649)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:326)
    at weblogic.security.service.SecurityManager.runAsForUserCode(SecurityManager.java:197)
    at weblogic.servlet.provider.WlsSecurityProvider.runAsForUserCode(WlsSecurityProvider.java:203)
    at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:71)
    at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2433)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2281)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2259)
    at weblogic.servlet.internal.ServletRequestImpl.runInternal(ServletRequestImpl.java:1691)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1651)
    at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:270)
    at weblogic.invocation.ComponentInvocationContextManager._runAs(ComponentInvocationContextManager.java:348)
    at weblogic.invocation.ComponentInvocationContextManager.runAs(ComponentInvocationContextManager.java:333)
    at weblogic.work.LivePartitionUtility.doRunWorkUnderContext(LivePartitionUtility.java:54)
    at weblogic.work.PartitionUtility.runWorkUnderContext(PartitionUtility.java:41)
    at weblogic.work.SelfTuningWorkManagerImpl.runWorkUnderContext(SelfTuningWorkManagerImpl.java:640)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:406)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:346)
Caused by: com.exception.RuleException
    at com.ejb.ReportManagementBean.doLUMValidate(ReportManagementBean.java:92)
    at com.ejb.ReportManagement_tq6u66_EOImpl.__WL_invoke(Unknown Source)
    at weblogic.ejb.container.internal.SessionRemoteMethodInvoker.invokeInternal(SessionRemoteMethodInvoker.java:54)
    at weblogic.ejb.container.internal.SessionRemoteMethodInvoker.invoke(SessionRemoteMethodInvoker.java:21)
    ... 55 more

Будем очень признательны за любые рекомендации в этом вопросе.


person andyfinch    schedule 21.02.2017    source источник
comment
RuleException сериализуемый?   -  person Steve C    schedule 24.02.2017
comment
public class RuleException extends Exception implements Serializable Exception расширяет Throwable, который реализует Serializable, поэтому он определенно Serializable. Также в моем тестовом классе у него нет дополнительных свойств.   -  person andyfinch    schedule 03.03.2017
comment
@andyfinch, мы тоже сталкиваемся с той же проблемой, расскажите, пожалуйста, как вы ее решили?   -  person Ramesh Kotha    schedule 17.05.2017
comment
@RameshKotha У нас есть проблема с Oracle Ошибка 25729346 / а>   -  person andyfinch    schedule 17.05.2017
comment
Спасибо @andyfinch, я не могу просмотреть ссылку, не могли бы вы опубликовать контент?   -  person Ramesh Kotha    schedule 17.05.2017
comment
@RameshKotha. На самом деле это не добавляет ничего большего, чем описано здесь. Однако я считаю, что вам просто нужен вход в службу поддержки Oracle, чтобы просмотреть это.   -  person andyfinch    schedule 18.05.2017
comment
@andyfinch мы обновили EJB до 3.0 с 2.1, и проблема решена.!   -  person Ramesh Kotha    schedule 19.05.2017
comment
@RameshKotha Я знаю. Однако у нас есть много устаревших ejbs 2.1, которые не готовы к преобразованию. Преобразование также включает в себя изменение используемого кода поиска, поэтому для нас требуется много изменений кода.   -  person andyfinch    schedule 19.05.2017
comment
Да, вы правы, но у нас есть только один компонент EJB, обновили его. На данный момент все работает нормально. Спасибо за ваше время.!   -  person Ramesh Kotha    schedule 19.05.2017


Ответы (2)


Это было исправлено в патче Oracle по моему запросу. Ссылка для этого патча здесь Ссылка на исправление. Чтобы получить к нему доступ, вам понадобится вход в службу поддержки Oracle.

person andyfinch    schedule 20.07.2017
comment
Здравствуйте, у меня такая же проблема уже давно, но для доступа к решению оракула вам необходимо предоставить идентификатор поддержки, откуда вы его взяли, пожалуйста? - person Amira; 26.03.2020
comment
@Amira, вам нужно войти в систему, чтобы увидеть это. Однако он описывает патч для 12.2.1.2.0. Это было бы исправлено в последующем выпуске .3 или .4, так что можете ли вы обновить его до последней версии? - person andyfinch; 27.03.2020
comment
@andyfish, спасибо за вашу помощь :), я вошел в систему с моим Oracle Occount, но для этого требуется идентификатор поддержки, который я не знаю, откуда я могу его получить: / - person Amira; 28.03.2020
comment
@Amira, идентификатор патча - 25729346, однако идентификатор поддержки, о котором вы говорите, скорее всего, будет таким, что вам нужен контракт на поддержку с Oracle. - person andyfinch; 30.03.2020
comment
@andyfish большое спасибо, я увижу это со службой поддержки Oracle :) - person Amira; 01.04.2020

Этот:

 <enable-call-by-reference>true</enable-call-by-reference>

заставляет ваши удаленные вызовы в той же JVM иметь семантику локальных вызовов, включая обработку исключений.

person Steve C    schedule 21.02.2017
comment
Спасибо, но изменение этого параметра не решает мою проблему. - person andyfinch; 21.02.2017
comment
Убедитесь, что вы полностью отменили развертывание, а затем повторно развернули свое приложение. WebLogic исторически плохо замечал изменения в дескрипторах развертывания. - person Steve C; 22.02.2017
comment
Перезагрузил и удалил приложения / очистил кеши, но по-прежнему с той же ошибкой. - person andyfinch; 22.02.2017
comment
Я считаю, что где-то в вашей системе есть какая-то конфигурация, которая вызывает это, потому что поведение, которое вы видите, не соответствует спецификации. - person Steve C; 23.02.2017
comment
Я фактически создал простую войну с ejbs 2.1 и развернул в новом домене с той же проблемой. - person andyfinch; 23.02.2017