2 Replies Latest reply on Jun 23, 2012 12:27 PM by wdfink

    Stateful EJB invocation always occurs on the same node. Even after a new session is created.

    heyw

      In the following client example application, the SFSB will always invoked on the same node of a local cluster with two nodes. After three calls, the session bean is removed and a new session bean is created by a lookup.

       

      EJB remote client:


      public class Main {
      
          public static void main(String[] args) throws Exception {
      
              Properties props = new Properties();
              props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
              Context context = new InitialContext(props);
      
              ClusteredStateless clusteredStatelessBeanProxy = (ClusteredStateless) context
                      .lookup("ejb:/cluster/ClusteredStatelessBean!de.akquinet.jbosscc.cluster.ClusteredStateless");
      
              ClusteredStateful clusteredStatefulSession = getClusteredStatefulSession(context);
      
              for (int i = 0; i < 100; i++) {
      
                  String nodeName = clusteredStatelessBeanProxy.getNodeName();
                  System.out.println("nodename: " + nodeName);
      
                  int counterValue = clusteredStatefulSession.getCounterValue();
                  System.out.println("Stateful session bean - counter value "
                          + counterValue + " recieved from node: "
                          + clusteredStatefulSession.getNodeName() + " proxy "
                          + clusteredStatefulSession);
                  if (counterValue % 3 == 0) {
                      System.out.println("destroy stateful ejb on node: "
                              + clusteredStatefulSession.getNodeName());
                      clusteredStatefulSession.destroy();
                      clusteredStatefulSession = getClusteredStatefulSession(context);
                  }
              }
          }
      
          static ClusteredStateful getClusteredStatefulSession(final Context context)
                  throws Exception {
      
              return (ClusteredStateful) context
                      .lookup("ejb:/cluster/ClusteredStatefulBean!de.akquinet.jbosscc.cluster.ClusteredStateful?stateful");
          }
      
      }
      

       

      JBoss EJB client configuration:

       

      remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
      
      remote.connections=one
      
      remote.connection.one.host=192.168.0.1
      remote.connection.one.port=4447
      remote.connection.one.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
      
      
      remote.clusters=ejb
      
      remote.cluster.ejb.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
      remote.cluster.ejb.connect.options.org.xnio.Options.SSL_ENABLED=false
      
      #remote.cluster.ejb.clusternode.selector=de.akquinet.jbosscc.cluster.RoundRobinClusterNodeSelector
      

       

      Log:

       

      23.06.2012 17:04:09 org.jboss.ejb.client.EJBClient <clinit>
      INFO: JBoss EJB Client version 1.1.0.Beta1-SNAPSHOT
      23.06.2012 17:04:09 org.xnio.Xnio <clinit>
      INFO: XNIO Version 3.0.3.GA
      23.06.2012 17:04:09 org.xnio.nio.NioXnio <clinit>
      INFO: XNIO NIO Implementation Version 3.0.3.GA
      23.06.2012 17:04:09 org.jboss.remoting3.EndpointImpl <clinit>
      INFO: JBoss Remoting version 3.2.7.GA
      23.06.2012 17:04:09 org.jboss.ejb.client.remoting.VersionReceiver handleMessage
      INFO: Received server version 1 and marshalling strategies [river]
      23.06.2012 17:04:09 org.jboss.ejb.client.remoting.RemotingConnectionEJBReceiver associate
      INFO: Successful version handshake completed for receiver context EJBReceiverContext{clientContext=org.jboss.ejb.client.EJBClientContext@6426d607, receiver=Remoting connection EJB receiver [connection=Remoting connection <788ab708>,channel=jboss.ejb,nodename=jb1]} on channel Channel ID e7e65166 (outbound) of Remoting connection 33589e56 to /192.168.0.1:4447
      23.06.2012 17:04:09 org.jboss.ejb.client.ClusterContext registerEJBReceiver
      INFO: Added a new EJB receiver in cluster context ejb for node jb1. Total nodes in cluster context = 1
      23.06.2012 17:04:09 org.jboss.ejb.client.remoting.VersionReceiver handleMessage
      INFO: Received server version 1 and marshalling strategies [river]
      23.06.2012 17:04:09 org.jboss.ejb.client.remoting.RemotingConnectionEJBReceiver associate
      INFO: Successful version handshake completed for receiver context EJBReceiverContext{clientContext=org.jboss.ejb.client.EJBClientContext@6426d607, receiver=Remoting connection EJB receiver [connection=Remoting connection <e4865ce>,channel=jboss.ejb,nodename=jb2]} on channel Channel ID 97031800 (outbound) of Remoting connection 39ed1b0b to /192.168.0.2:4447
      23.06.2012 17:04:09 org.jboss.ejb.client.ClusterContext registerEJBReceiver
      INFO: Added a new EJB receiver in cluster context ejb for node jb2. Total nodes in cluster context = 2
      nodename: jb1
      Stateful session bean - counter value 1 recieved from node: jb1 proxy Proxy for remote EJB StatefulEJBLocator{appName='', moduleName='cluster', distinctName='', beanName='ClusteredStatefulBean', view='interface de.akquinet.jbosscc.cluster.ClusteredStateful', sessionId='{[74, 113, 3, -98, -111, -95, 68, -126, -128, -69, 90, -5, 49, -43, 25, 82]}'}
      nodename: jb1
      Stateful session bean - counter value 2 recieved from node: jb1 proxy Proxy for remote EJB StatefulEJBLocator{appName='', moduleName='cluster', distinctName='', beanName='ClusteredStatefulBean', view='interface de.akquinet.jbosscc.cluster.ClusteredStateful', sessionId='{[74, 113, 3, -98, -111, -95, 68, -126, -128, -69, 90, -5, 49, -43, 25, 82]}'}
      nodename: jb1
      Stateful session bean - counter value 3 recieved from node: jb1 proxy Proxy for remote EJB StatefulEJBLocator{appName='', moduleName='cluster', distinctName='', beanName='ClusteredStatefulBean', view='interface de.akquinet.jbosscc.cluster.ClusteredStateful', sessionId='{[74, 113, 3, -98, -111, -95, 68, -126, -128, -69, 90, -5, 49, -43, 25, 82]}'}
      destroy stateful ejb on node: jb1
      nodename: jb1
      Stateful session bean - counter value 1 recieved from node: jb1 proxy Proxy for remote EJB StatefulEJBLocator{appName='', moduleName='cluster', distinctName='', beanName='ClusteredStatefulBean', view='interface de.akquinet.jbosscc.cluster.ClusteredStateful', sessionId='{[-83, -62, 69, 37, 114, 4, 75, -119, -127, -116, 46, 34, -84, 29, -31, -36]}'}
      nodename: jb2
      Stateful session bean - counter value 2 recieved from node: jb1 proxy Proxy for remote EJB StatefulEJBLocator{appName='', moduleName='cluster', distinctName='', beanName='ClusteredStatefulBean', view='interface de.akquinet.jbosscc.cluster.ClusteredStateful', sessionId='{[-83, -62, 69, 37, 114, 4, 75, -119, -127, -116, 46, 34, -84, 29, -31, -36]}'}
      nodename: jb1
      Stateful session bean - counter value 3 recieved from node: jb1 proxy Proxy for remote EJB StatefulEJBLocator{appName='', moduleName='cluster', distinctName='', beanName='ClusteredStatefulBean', view='interface de.akquinet.jbosscc.cluster.ClusteredStateful', sessionId='{[-83, -62, 69, 37, 114, 4, 75, -119, -127, -116, 46, 34, -84, 29, -31, -36]}'}
      destroy stateful ejb on node: jb1
      nodename: jb1
      Stateful session bean - counter value 1 recieved from node: jb1 proxy Proxy for remote EJB StatefulEJBLocator{appName='', moduleName='cluster', distinctName='', beanName='ClusteredStatefulBean', view='interface de.akquinet.jbosscc.cluster.ClusteredStateful', sessionId='{[113, 58, 100, 72, -47, -98, 65, -77, -122, -37, 5, 94, 23, -85, -33, 2]}'}
      nodename: jb2
      ...
      

       

      Even, if the custom cluster node selector is activated, the selector will only called for SLSB invocations.

       

      Is it possible to configure a policy for load balancing of new SFSB invocations?