0 Replies Latest reply on Feb 11, 2005 12:54 PM by schaffal

    HA-JNDI lookup of a JMS queue is ok on one node but fails o

    schaffal Newbie

      For test purposes, I've to get knowledge on JBoss Clustering, fail-over, replication...

      I've been turning around the following issue for some days now,
      reading JBoss Clustering (Edition 7), Wiki, forum and bug reports. I
      just hope it's something stupid I cannot pinpoint.

      Setting : JBoss 4.0.1 ; 2 Linux servers (Suse) in the Cluster.

      Beans are :
      - HelloMDB : basic message driven bean listening on 'queue/hello'
      - HelloServletJMS : servlet to send messages to 'queue/hello'

      Note :
      - both servers are multihomed
      - Oracle is the common Database used (runs on Server1) ( deployed using ConfigJBossMQDB wiki page )
      - use of DefaultPartition with default ports.

      Server2 is started prior to Server1 (thus Server2 is the HA-JNDI server.)

      Inside HelloServletJMS's, the code to send the message to HelloMDB (all try/catch and close removed):

      InitialContext context = new InitialContext();
       Queue queue = (Queue) context.lookup("queue/hello");
       QueueConnectionFactory queueFactory = (QueueConnectionFactory) context.lookup("XAConnectionFactory");
       QueueConnection queueConnection = queueFactory.createQueueConnection();
       QueueSession queueSession = queueConnection.createQueueSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
       QueueSender queueSender = queueSession.createSender(queue);
       TextMessage message = queueSession.createTextMessage();

      When doing an http request (from a third machine on another LAN) on HelloServletJMS :
      on Server2 => OK : message treated by HelloMDB ( on Server1 or Server2 )
      on Server1 => KO

      Error on server1 is :
      javax.naming.NameNotFoundException: queue not bound
       at org.jnp.server.NamingServer.getBinding(NamingServer.java:491)
       at org.jnp.server.NamingServer.getBinding(NamingServer.java:499)
       at org.jnp.server.NamingServer.getObject(NamingServer.java:505)
       at org.jnp.server.NamingServer.lookup(NamingServer.java:249)
       at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:544)
       at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:520)
       at javax.naming.InitialContext.lookup(InitialContext.java:347)
       at hello.web.HelloServletJMS.doGet(HelloServletJMS.java:135)

      META-INF/jboss.xml of the jar is ( message-driven part only ) :

      /opt/jboss/server/all/deploy/jms/hajndi-jms-ds.xml (JMS part) :
      <mbean code="org.jboss.jms.jndi.JMSProviderLoader"
       <attribute name="ProviderName">DefaultJMSProvider</attribute>
       <attribute name="ProviderAdapterClass">
       <!-- The combined connection factory -->
       <attribute name="FactoryRef">java:/XAConnectionFactory</attribute>
       <!-- The queue connection factory -->
       <attribute name="QueueFactoryRef">XAConnectionFactory</attribute>
       <!-- The topic factory -->
       <attribute name="TopicFactoryRef">XAConnectionFactory</attribute>
       <!-- Access JMS via HAJNDI -->
       <attribute name="Properties">
       java.naming.provider.url=[Local IP of Server2]:1100,[Local IP of Server1]:1100

      JGroup uses UDP ; from /opt/jboss/server/all/deploy/cluster-service.xml :
      <UDP mcast_addr="" mcast_port="45566"
       ip_ttl="32" ip_mcast="true"
       mcast_send_buf_size="800000" mcast_recv_buf_size="150000"
       ucast_send_buf_size="800000" ucast_recv_buf_size="150000"
       loopback="false" bind_addr="[LocalIP Due To Multi Homed Server]" />

      Where local IP is correctly set to the ethernet card in use on the LAN.

      Things verified :
      - /etc/hosts :
      " localhost" and local IPs are on 2 different lines.

      - /etc/modules.conf (just in case since IPv6 is not used) :
      "alias net-pf-10 off"

      - multicast route is fine :
      "netstat -nr | grep 224" gives the correct multicast route on both devices ( and on the correct ethernet card device ) U 40 0 0 eth0

      - I do start with "-c all" and the --host=[LocalIP] options

      I tried different combinations with "jnp://..." and "localhost:1100" for java.naming.provider.url ( even if loopbackIP:1100 was not opened )

      I checked traffic on Server2:1100 . Port is used by Server1 at startup ( first in java.naming.provider.url ), but no traffic afterward ( neither on the autodiscovery port 1102 ).

      I checked traffic on : ok (heartbeat packets go through)

      I checked traffic on autodiscovery multicast ip : ok (membership packets go through)

      If Server1 becomes HA-JNDI server, lookup on 'queue/hello' from Server1 are ok, not lookup from Server2. (only difference in config files is the bind_addr due to multi-homed servers)

      What did I miss here ?
      If more src/config files are needed to solve this, i'll be more than happy to send them.