Uploaded image for project: 'WildFly'
  1. WildFly
  2. WFLY-10087

EJB uses the same remote outbound connection all the time

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Major Major
    • 13.0.0.Final
    • 12.0.0.Final
    • EJB, Remoting
    • None
    • Hide

      Download and unzip WF 12 to three folders - master, slave1, slave2
      start master ./bin/standalone.sh -c standalone-full.xml and configure it

      1. ./bin/standalone.sh -c standalone-full.xml
      2. /socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=remote-ejb-slave1:add(host=localhost, port=8180)
      3. /socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=remote-ejb-slave2:add(host=localhost, port=8280)
      4. /core-service=management/security-realm=ejb-security-realm:add()
      5. /core-service=management/security-realm=ejb-security-realm/server-identity=secret:add(value="YWRtaW4xMjMr")
      6. /subsystem=remoting/remote-outbound-connection=remote-ejb-connection-slave1:add(outbound-socket-binding-ref=remote-ejb-slave1, protocol=http-remoting, security-realm=ejb-security-realm, username=admin)
      7. /subsystem=remoting/remote-outbound-connection=remote-ejb-connection-slave2:add(outbound-socket-binding-ref=remote-ejb-slave2, protocol=http-remoting, security-realm=ejb-security-realm, username=admin)
      8. deploy client-side.war

      configure and start slave 1:

      1. bin/add-user.sh -a -g users -u admin -p admin123+
      2. ./bin/standalone.sh -c standalone-full.xml -Djboss.socket.binding.port-offset=100
      3. deploy server-side-slave1.jar

      configure and start slave 2:

      1. bin/add-user.sh -a -g users -u admin -p admin123+
      2. ./bin/standalone.sh -c standalone-full.xml -Djboss.socket.binding.port-offset=200
      3. deploy server-side-slave2.jar

      Access localhost:8080/client-side/

      Show
      Download and unzip WF 12 to three folders - master, slave1, slave2 start master ./bin/standalone.sh -c standalone-full.xml and configure it ./bin/standalone.sh -c standalone-full.xml /socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=remote-ejb-slave1:add(host=localhost, port=8180) /socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=remote-ejb-slave2:add(host=localhost, port=8280) /core-service=management/security-realm=ejb-security-realm:add() /core-service=management/security-realm=ejb-security-realm/server-identity=secret:add(value="YWRtaW4xMjMr") /subsystem=remoting/remote-outbound-connection=remote-ejb-connection-slave1:add(outbound-socket-binding-ref=remote-ejb-slave1, protocol=http-remoting, security-realm=ejb-security-realm, username=admin) /subsystem=remoting/remote-outbound-connection=remote-ejb-connection-slave2:add(outbound-socket-binding-ref=remote-ejb-slave2, protocol=http-remoting, security-realm=ejb-security-realm, username=admin) deploy client-side.war configure and start slave 1: bin/add-user.sh -a -g users -u admin -p admin123+ ./bin/standalone.sh -c standalone-full.xml -Djboss.socket.binding.port-offset=100 deploy server-side-slave1.jar configure and start slave 2: bin/add-user.sh -a -g users -u admin -p admin123+ ./bin/standalone.sh -c standalone-full.xml -Djboss.socket.binding.port-offset=200 deploy server-side-slave2.jar Access localhost:8080/client-side/
    • Regression

      Lets have three servers master, slave1, slave2. Master has two remote outbound connection defined that point to slave1 and slave2.

      When the EJB deployed to master needs to call two EJB (slave1 and slave2), the first call is successful, but the second one is not because the EJB uses remote outbound connection that points to slave1 (instead of slave2).

      This results to the followinf exception:

      14:28:18,914 ERROR [io.undertow.request] (default task-1) UT005023: Exception handling request to /client-side/: javax.ejb.EJBException: java.lang.RuntimeException: javax.ejb.NoSuchEJBException: No such EJB: /server-side-slave2/WhoAmIBean @ http-remoting://localhost:8180
      	at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:186)
      	at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:275)
      	at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:330)
      	at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:238)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:509)
      	at org.jboss.weld.module.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:72)
      	at org.jboss.as.weld.ejb.EjbRequestScopeActivationInterceptor.processInvocation(EjbRequestScopeActivationInterceptor.java:89)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.as.ejb3.component.invocationmetrics.WaitTimeInterceptor.processInvocation(WaitTimeInterceptor.java:47)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.as.ejb3.security.SecurityContextInterceptor.processInvocation(SecurityContextInterceptor.java:100)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.as.ejb3.deployment.processors.StartupAwaitInterceptor.processInvocation(StartupAwaitInterceptor.java:22)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory$1.processInvocation(ShutDownInterceptorFactory.java:64)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:67)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:54)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:60)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:438)
      	at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:619)
      	at org.jboss.invocation.AccessCheckingInterceptor.processInvocation(AccessCheckingInterceptor.java:57)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:53)
      	at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:198)
      	at org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:185)
      	at org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:81)
      	at example.BeanRemote$$$view1.callNext(Unknown Source)
      	at example.ClientServlet.doGet(ClientServlet.java:36)
      	at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
      	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
      	at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
      	at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
      	at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:67)
      	at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
      	at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
      	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
      	at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
      	at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
      	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
      	at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
      	at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
      	at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
      	at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
      	at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
      	at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
      	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
      	at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
      	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
      	at org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)
      	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
      	at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
      	at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
      	at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
      	at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
      	at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
      	at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
      	at org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
      	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1526)
      	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1526)
      	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1526)
      	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1526)
      	at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
      	at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
      	at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
      	at io.undertow.server.Connectors.executeRootHandler(Connectors.java:360)
      	at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
      	at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
      	at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)
      	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)
      	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378)
      	at java.lang.Thread.run(Thread.java:748)
      Caused by: java.lang.RuntimeException: javax.ejb.NoSuchEJBException: No such EJB: /server-side-slave2/WhoAmIBean @ http-remoting://localhost:8180
      	at example.Bean.callNext(Bean.java:23)
      	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 org.jboss.as.ee.component.ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptor.java:52)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:509)
      	at org.jboss.as.weld.interceptors.Jsr299BindingsInterceptor.doMethodInterception(Jsr299BindingsInterceptor.java:90)
      	at org.jboss.as.weld.interceptors.Jsr299BindingsInterceptor.processInvocation(Jsr299BindingsInterceptor.java:101)
      	at org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:63)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.as.ejb3.component.invocationmetrics.ExecutionTimeInterceptor.processInvocation(ExecutionTimeInterceptor.java:43)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.as.jpa.interceptor.SBInvocationInterceptor.processInvocation(SBInvocationInterceptor.java:47)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:40)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:53)
      	at org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor.processInvocation(ComponentDispatcherInterceptor.java:52)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.as.ejb3.component.pool.PooledInstanceInterceptor.processInvocation(PooledInstanceInterceptor.java:51)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
      	at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:273)
      	... 78 more
      Caused by: javax.ejb.NoSuchEJBException: No such EJB: /server-side-slave2/WhoAmIBean @ http-remoting://localhost:8180
      	at org.jboss.ejb.protocol.remote.EJBClientChannel$MethodInvocation.handleResponse(EJBClientChannel.java:1070)
      	at org.jboss.ejb.protocol.remote.EJBClientChannel$MethodInvocation.handleResponse(EJBClientChannel.java:997)
      	at org.jboss.remoting3.util.InvocationTracker.signalResponse(InvocationTracker.java:167)
      	at org.jboss.ejb.protocol.remote.EJBClientChannel.processMessage(EJBClientChannel.java:186)
      	at org.jboss.ejb.protocol.remote.EJBClientChannel.access$100(EJBClientChannel.java:112)
      	at org.jboss.ejb.protocol.remote.EJBClientChannel$1$1.handleMessage(EJBClientChannel.java:675)
      	at org.jboss.remoting3.remote.RemoteConnectionChannel.lambda$handleMessageData$3(RemoteConnectionChannel.java:430)
      	at org.jboss.remoting3.EndpointImpl$TrackingExecutor.lambda$execute$0(EndpointImpl.java:926)
      	... 5 more
      	Suppressed: javax.ejb.NoSuchEJBException: No such EJB: /server-side-slave2/WhoAmIBean @ http-remoting://localhost:8180
      		... 13 more
      	Suppressed: javax.ejb.NoSuchEJBException: No such EJB: /server-side-slave2/WhoAmIBean @ http-remoting://localhost:8180
      		... 13 more
      	Suppressed: javax.ejb.NoSuchEJBException: No such EJB: /server-side-slave2/WhoAmIBean @ http-remoting://localhost:8180
      		... 13 more
      	Suppressed: javax.ejb.NoSuchEJBException: No such EJB: /server-side-slave2/WhoAmIBean @ http-remoting://localhost:8180
      		... 13 more
      	Suppressed: javax.ejb.NoSuchEJBException: No such EJB: /server-side-slave2/WhoAmIBean @ http-remoting://localhost:8180
      		... 13 more
      	Suppressed: javax.ejb.NoSuchEJBException: No such EJB: /server-side-slave2/WhoAmIBean @ http-remoting://localhost:8180
      		at org.jboss.ejb.protocol.remote.EJBClientChannel$MethodInvocation.handleResponse(EJBClientChannel.java:1070)
      		at org.jboss.ejb.protocol.remote.EJBClientChannel$MethodInvocation.handleResponse(EJBClientChannel.java:997)
      		at org.jboss.remoting3.util.InvocationTracker.signalResponse(InvocationTracker.java:167)
      		at org.jboss.ejb.protocol.remote.EJBClientChannel.processMessage(EJBClientChannel.java:186)
      		at org.jboss.ejb.protocol.remote.EJBClientChannel.access$100(EJBClientChannel.java:112)
      		at org.jboss.ejb.protocol.remote.EJBClientChannel$1$1.handleMessage(EJBClientChannel.java:675)
      		at org.jboss.remoting3.remote.RemoteConnectionChannel.lambda$receiveMessage$2(RemoteConnectionChannel.java:361)
      		... 6 more
      	Suppressed: javax.ejb.NoSuchEJBException: No such EJB: /server-side-slave2/WhoAmIBean @ http-remoting://localhost:8180
      		... 13 more
      	Suppressed: javax.ejb.NoSuchEJBException: No such EJB: /server-side-slave2/WhoAmIBean @ http-remoting://localhost:8180
      		... 13 more
      

      Server side EJB (slave1, slave2) are simple:

      @Stateless
      public class WhoAmIBean implements WhoAmIBeanRemote {
          @Override
          public String whoAmI() {
              String s = "WhoAmIBean.whoAmI called on server with port-offset " + System.getProperty("jboss.socket.binding.port-offset");
              System.out.println(s);
              return s;
          }
      }
      

      Client side war (master) is simple servlet and EJB that performs calls.

      @WebServlet(urlPatterns = "/")
      public class ClientServlet extends HttpServlet {
          @EJB
          private BeanRemote bean;
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                  throws ServletException, IOException {
              bean.callNext();
          }
      }
      
      @Stateless
      public class Bean implements BeanRemote {
          @EJB(lookup = "ejb:/server-side-slave1/WhoAmIBean!example.ejb.WhoAmIBeanRemote")
          private WhoAmIBeanRemote remoteBean1ByInjection;
      
          @EJB(lookup = "ejb:/server-side-slave2/WhoAmIBean!example.ejb.WhoAmIBeanRemote")
          private WhoAmIBeanRemote remoteBean2ByInjection;
      
          @Override
          public void callNext() throws RemoteException {
              try {
                  StringBuilder sb = new StringBuilder();
                  sb.append("WhoAmI from server-side-slave1 returned: ").append(remoteBean1ByInjection.whoAmI()).append("\n");
                  sb.append("WhoAmI from server-side-slave2 returned: ").append(remoteBean2ByInjection.whoAmI()).append("\n");
              } catch (Exception e) {
                  throw new RuntimeException(e);
              }
          }
      }
      

      If the servlet performs calls (instead of local bean) both calls will be successful.

            jondruse@redhat.com Jiri Ondrusek
            istraka@redhat.com Ivan Straka
            Votes:
            0 Vote for this issue
            Watchers:
            6 Start watching this issue

              Created:
              Updated:
              Resolved: