[jboss-user] [JBoss Messaging] - Re: Queue MaxSize Not Obeyed When Using Transacted Sessions

vishalrao do-not-reply at jboss.com
Mon Jul 7 13:55:02 EDT 2008


Hello Andy,

The test for the first case involves using HermesJMS to look at the queue
and make sure it is empty.  And then running the following code:



  | 
  | 
  | import java.util.Date;
  | import java.util.Properties;
  | 
  | 
  | import java.io.IOException;
  | 
  | import javax.jms.Connection;
  | import javax.jms.DeliveryMode;
  | import javax.jms.Destination;
  | import javax.jms.MessageProducer;
  | import javax.jms.Session;
  | import javax.jms.TextMessage;
  | import javax.naming.Context;
  | import javax.naming.InitialContext;
  | 
  | /**
  |  * A simple tool for publishing messages
  |  * 
  |  * @version $Revision: 1.2 $
  |  */
  | 
  | public class ProducerJBM 
  | {
  | 
  |     private Destination destination;
  |     private int messageCount; 
  |     private long sleepTime;
  |     private boolean verbose = true;
  |     private int messageSize; 
  |     private long timeToLive;
  |     private String queueName; 
  |     private String providerURL;
  |     private String connectionFactoryBinding;
  |     private boolean transacted;
  |    
  | 
  |     /**************************************************************************/
  |     public static void main(String[] args) 
  |     {
  |         ProducerJBM producer = new ProducerJBM();
  |         producer.run();
  |     }
  |     /**************************************************************************/
  |     public ProducerJBM()
  |     {
  |         Properties props = new Properties();
  |         try
  |         {
  |             props.load(this.getClass().getClassLoader().getResourceAsStream("jbm.properties"));
  |         }
  |         catch (IOException ioe)
  |         {
  |             System.err.println("Error loading jbm.properties.");
  |             ioe.printStackTrace(System.err);
  |             System.exit(-1);
  |         }
  |        
  |         providerURL = props.getProperty("provider_url"); 
  |         messageCount = Integer.parseInt(props.getProperty("num_messages_to_send"));
  |         if (messageCount == -1)
  |             messageCount = Integer.MAX_VALUE;
  |         queueName = props.getProperty("queue_name");
  |         messageSize = Integer.parseInt(props.getProperty("message_size"));
  |         sleepTime = Long.parseLong(props.getProperty("producer.sleep_time_ms"));
  |         connectionFactoryBinding = props.getProperty("connection_factory_binding");
  |         transacted = Boolean.parseBoolean(props.getProperty("producer.transacted").trim());
  |     }
  |     /**************************************************************************/
  |     public void run()  
  |     {
  |         Connection connection = null;
  |         
  |         try 
  |         {
  |             // System.out.println("Connecting to URL: " + url);
  |             System.out.println("Publishing a Message with size " 
  |                 + messageSize + " to queue" + ": " 
  |                 + queueName);
  |             System.out.println("Sleeping between publish " + sleepTime + " ms");
  |             if (timeToLive != 0) {
  |                 System.out.println("Messages time to live " + timeToLive + " ms");
  |             }
  | 
  |             Properties props = new Properties();
  |             props.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
  |             props.setProperty(Context.PROVIDER_URL, providerURL);
  |             props.setProperty(Context.URL_PKG_PREFIXES,"org.jboss.naming:org.jnp.interfaces");
  |             
  |             
  |             javax.naming.Context ctx = new InitialContext(props);
  |             
  |             javax.jms.ConnectionFactory factory = 
  |                 (javax.jms.ConnectionFactory)ctx.lookup(connectionFactoryBinding);
  | 
  |             connection = factory.createConnection();
  |             
  |             connection.start();
  | 
  |             // Create the session
  |             Session session = connection.createSession(
  |                 transacted, 
  |                 Session.AUTO_ACKNOWLEDGE);
  |             System.err.println("Session transaction mode: " + transacted);
  |            
  |            destination = session.createQueue(queueName);
  |            
  |             // Create the producer.
  |             MessageProducer producer = session.createProducer(destination);
  |             producer.setDeliveryMode(DeliveryMode.PERSISTENT);
  |            
  |             if (timeToLive != 0) {
  |                 producer.setTimeToLive(timeToLive);
  |             }
  | 
  |             // Start sending messages
  |             sendLoop(session, producer);
  | 
  |             if (transacted)
  |             {
  |                 System.err.println("About to commit the session.");
  |                 session.commit();
  |                 System.err.println("Finished commiting the session.");
  |             }
  |             System.out.println("Done.");
  | 
  |         } 
  |         catch (Exception e) 
  |         {
  |             System.out.println("Caught: " + e);
  |             e.printStackTrace();
  |         } 
  |         finally 
  |         {
  |             System.err.println();
  |             System.err.println("We have reached the finally block.");
  |             try 
  |             {
  |                 System.err.println("About to close JMS connection.");
  |                 connection.close();
  |                 System.err.println("Finished closing the JMS connection.");
  |             } 
  |             catch (Throwable ignore) 
  |             {
  |             }
  |         }
  |     }
  |     /**************************************************************************/
  |     protected void sendLoop(Session session, MessageProducer producer) 
  |         throws Exception 
  |     {
  | 
  |         for (int i = 0; i < messageCount || messageCount == 0; i++) 
  |         {
  |             /*if (i == 20)
  |                 throw new Exception("This is an intentionl test exception thrown by Vishal");*/
  |             TextMessage message = session.createTextMessage(i+"");
  | 
  |                 String msg = message.getText();
  |                 System.out.println("Sending message: " + msg);
  |             message.setJMSMessageID("ID:"+messageCount);
  |             message.setJMSCorrelationID("JMS CID:"+messageCount);
  |             producer.send(message);
  |            
  | 
  |             Thread.sleep(sleepTime);
  | 
  |         }
  |     }
  |     /**************************************************************************/
  | }
  | 
  | 
  | 
  | 



Here is my jbm.properties file.  It's used by a few different
client programs, but I post it here in its entirety for the sake
of not smudging the evidence ;)   For the sake of the current
issue we are discussing, I am only running the above client
program.



  | provider_url = jnp://162.10.170.78:1399
  | 
  | connection_factory_binding = ConnectionFactory
  | 
  | queue_name = FR.SYNC.RESPONSE
  | num_messages_to_send = 200
  | message_size = 255
  | 
  | 
  | producer.sleep_time_ms = 10
  | 
  | 
  | consumer.sleep_time_ms = 100
  | 
  | 
  | producer.transacted = true
  | consumer.transacted = true
  | 
  | 
  | consumer.even.num_threads = 4
  | consumer.even.sleep_time_ms = 1000
  | 
  | consumer.odd.num_threads = 4
  | consumer.odd.sleep_time_ms = 1000
  | 
  | 


I run the program, notice that it has completed successfully
(no exception) and then notice in HermesJMS that 200 messages
show up.  

All this time, I have confirmed that MaxSize==20 in JBoss JMX
MBean page for the queue.

Thanks,
Vishal

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4162920#4162920

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4162920



More information about the jboss-user mailing list