0 Replies Latest reply on Jul 2, 2012 8:32 AM by vjbhakta

    Using JMS Topic with Jboss Messaging 1.4.2.GA-SP1 seems unreliable.

    vjbhakta

      Hi,

      Does anyone have experienced this and has a suggestion?
      I am using JBoss 4.2.3.GA with JBoss-Messaging 1.4.2.GA-SP1


      In my real application, I have now and then observed a JMS Message not received at one or the other client.
      To reproduce and analyze the same, I have made simple program closer to my scenario and focus on JMS.
      Let me brief you the scenario:
      1. A stateless Bean deployed with a method that generates 100 JMS messages to JMS Topic. Its more frequent when message size is ~1k.
      2. An external client 'API-Caller' that invokes the bean and calls the method, once every second for duration of 1-min. I launch typically more than 40 such clients.
      3. I stamped each Message with EventNumber, an incremental number to uniquely identify it.
      4. A Client 'Event-Listener' which subscribes to the JMS Topic and waits/receives messages. I launch 4 instances of this client on two different systems with 2 on each. Each 'Event-Listener' notes that the EventNumber if JMS Message skips a number.

      I am running JBoss on Windows7 64-bit and Debian-Linux(Squeeze)
      And Clients 'API-Caller' and 'Event-Listener' on WindowsXP machine.

      Running this test, I see that some JMS Messages are not received by one or the other client. Also, a Message received by one client is not recieved by other running on same system.


      A code outline of my stateless Bean :-------------------------------------->

      public class MyBean
          implements IMyBean
      {

          private static synchronized int getEventNumber ()
          {
              return ++mEventNumber;
          }


          public int produce100Messages (int PayloadInBytes)
          {
              Connection connection = null;
              Session session = null;
              MessageProducer publisher = null;
              Integer num = 0;

              String payload = "";
              for(int i=0; i<PayloadInBytes; i++)
              {
                  payload += "Z";           
              }
             
              try
              {
                  InitialContext ic = new InitialContext();

                  ConnectionFactory cf = (ConnectionFactory) ic.lookup("java:/JmsXA");
                  Topic topic = (Topic) ic.lookup("topic/MyTopic");

                  connection = cf.createConnection();
                  session = connection.createSession(true, Session.SESSION_TRANSACTED);
                  publisher = session.createProducer(topic);

                  connection.start();

                  num = getEventNumber();
                  num = num * 100;
                  for (int i = 0; i < 100; i++)
                  {
                      Message msg = session.createTextMessage(num.toString() + ";" + payload);
                     
                      publisher.send(msg);
                      num++;
                  }
                  num--;
              }
              catch (Exception anException)
              {
                  anException.printStackTrace();
              }
              finally
              {
                     ...
                     //Close producer, session, and connection
                 
              }
              return num;
          }
      }


      The code outline at subscriber end :------------------------------------------->
      public class MYMsgListener
          implements MessageListener
      {
         ...

         public void onMessage (Message anArg0)
          {
           ...
           ...

                  String[] arrStr = ((TextMessage) anArg0).getText().split(";");           

                  Integer eventNumber = Integer.parseInt(arrStr[0]);
                  mEventQ.add(eventNumber);
           ...
          }
          ...