1 Reply Latest reply on Aug 5, 2009 6:34 PM by brian.stansberry

    HAJNDI not handling failover

      I have two JBoss 4.2.3GA nodes in a cluster with a Tomcat 5 application calling SLSBs on them. Standard stuff. If either node is down, the client can find the other when it first needs a service. If both are up, the client finds the first one to use a service, then the first node is shut down, the client fails with a CannotConnectException despite the second node still being available.

      I can reproduce the problem on my local PC and logs like the following show the nodes recognise the other cluster member as it's started and shutdown.

      18:45:30,405 INFO [UefaPartition] New cluster view for partition UefaPartition (id: 3, delta: 1) : [127.0.0.1:1299, 127.0.0.1:1099]
      18:45:30,405 INFO [UefaPartition] I am (127.0.0.1:1299) received membershipChanged event:
      18:45:30,405 INFO [UefaPartition] Dead members: 0 ([])
      18:45:30,405 INFO [UefaPartition] New Members : 1 ([127.0.0.1:1099])
      18:45:30,405 INFO [UefaPartition] All Members : 2 ([127.0.0.1:1299, 127.0.0.1:1099])
      18:48:40,850 INFO [UefaPartition] New cluster view for partition UefaPartition (id: 4, delta: -1) : [127.0.0.1:1299]
      18:48:40,850 INFO [UefaPartition] I am (127.0.0.1:1299) received membershipChanged event:
      18:48:40,850 INFO [UefaPartition] Dead members: 1 ([127.0.0.1:1099])
      18:48:40,850 INFO [UefaPartition] New Members : 0 ([])
      18:48:40,850 INFO [UefaPartition] All Members : 1 ([127.0.0.1:1299])


      The client fails with the following.
      Caused by: org.jboss.remoting.CannotConnectException: Can not get connection to server. Problem establishing socket connection for InvokerLocator [socket://127.0.0.1:4446/?dataType=invocation&enableTcpNoDelay=true&marshaller=org.jboss.invocation.unified.marshall.InvocationMarshaller&socketTimeout=600000&unmarshaller=org.jboss.invocation.unified.marshall.InvocationUnMarshaller]
       at org.jboss.remoting.transport.socket.MicroSocketClientInvoker.transport(MicroSocketClientInvoker.java:579)
       at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:122)
       at org.jboss.remoting.Client.invoke(Client.java:1634)
       at org.jboss.remoting.Client.invoke(Client.java:548)
       at org.jboss.invocation.unified.interfaces.UnifiedInvokerProxy.invoke(UnifiedInvokerProxy.java:184)
       at org.jboss.invocation.InvokerInterceptor.invokeInvoker(InvokerInterceptor.java:365)
       at org.jboss.invocation.InvokerInterceptor.invoke(InvokerInterceptor.java:197)
       at org.jboss.proxy.TransactionInterceptor.invoke(TransactionInterceptor.java:61)
       at org.jboss.proxy.SecurityInterceptor.invoke(SecurityInterceptor.java:70)
       at org.jboss.proxy.ejb.StatelessSessionInterceptor.invoke(StatelessSessionInterceptor.java:112)
       at org.jboss.proxy.ClientContainer.invoke(ClientContainer.java:100)
       at $Proxy14.getStatusSuccessFail(Unknown Source)


      This doesn't make sense as the client proxy should know there is another member of the cluster and try that. What am I missing?

        • 1. Re: HAJNDI not handling failover
          brian.stansberry

          You're not using a clustered EJB. If you want a cluster-aware EJB proxy you need to add @Clustered to your EJB3 bean class or add

          <clustered>true</clustered>


          to the bean's section in jboss.xml.

          HA-JNDI makes the naming operations HA, it doesn't automagically make the stuff bound in JNDI cluster-aware.