You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by js...@apache.org on 2008/08/26 12:33:33 UTC

svn commit: r689023 - in /activemq/trunk/activemq-core/src: main/java/org/apache/activemq/broker/jmx/QueueView.java test/java/org/apache/activemq/broker/jmx/MBeanTest.java

Author: jstrachan
Date: Tue Aug 26 03:33:32 2008
New Revision: 689023

URL: http://svn.apache.org/viewvc?rev=689023&view=rev
Log:
added a test case for AMQ-1909

Modified:
    activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/jmx/QueueView.java
    activemq/trunk/activemq-core/src/test/java/org/apache/activemq/broker/jmx/MBeanTest.java

Modified: activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/jmx/QueueView.java
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/jmx/QueueView.java?rev=689023&r1=689022&r2=689023&view=diff
==============================================================================
--- activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/jmx/QueueView.java (original)
+++ activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/jmx/QueueView.java Tue Aug 26 03:33:32 2008
@@ -18,6 +18,7 @@
 
 import javax.management.openmbean.CompositeData;
 import javax.management.openmbean.OpenDataException;
+import javax.jms.JMSException;
 
 import org.apache.activemq.broker.ConnectionContext;
 import org.apache.activemq.broker.region.Queue;
@@ -104,8 +105,13 @@
                 ConnectionContext context = BrokerView.getConnectionContext(broker.getContextBroker());
                 return queue.moveMessageTo(context, messageId, originalDestination);
             }
+            else {
+                throw new JMSException("No original destination for message: "+ messageId);
+            }
+        }
+        else {
+            throw new JMSException("Could not find message: "+ messageId);
         }
-        return false;
     }
     
     public int cursorSize() {

Modified: activemq/trunk/activemq-core/src/test/java/org/apache/activemq/broker/jmx/MBeanTest.java
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/broker/jmx/MBeanTest.java?rev=689023&r1=689022&r2=689023&view=diff
==============================================================================
--- activemq/trunk/activemq-core/src/test/java/org/apache/activemq/broker/jmx/MBeanTest.java (original)
+++ activemq/trunk/activemq-core/src/test/java/org/apache/activemq/broker/jmx/MBeanTest.java Tue Aug 26 03:33:32 2008
@@ -24,6 +24,7 @@
 import javax.jms.Message;
 import javax.jms.MessageProducer;
 import javax.jms.Session;
+import javax.jms.MessageConsumer;
 import javax.management.MBeanServer;
 import javax.management.MBeanServerInvocationHandler;
 import javax.management.MalformedObjectNameException;
@@ -32,9 +33,11 @@
 import javax.management.openmbean.TabularData;
 import junit.textui.TestRunner;
 import org.apache.activemq.EmbeddedBrokerTestSupport;
+import org.apache.activemq.ActiveMQConnectionFactory;
 import org.apache.activemq.command.ActiveMQQueue;
 import org.apache.activemq.broker.BrokerService;
 import org.apache.activemq.broker.region.BaseDestination;
+import org.apache.activemq.broker.region.policy.SharedDeadLetterStrategy;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -81,6 +84,142 @@
         assertConsumerCounts();
     }
 
+    public void testMoveMessages() throws Exception {
+        connection = connectionFactory.createConnection();
+        useConnection(connection);
+
+        ObjectName queueViewMBeanName = assertRegisteredObjectName(domain + ":Type=Queue,Destination=" + getDestinationString() + ",BrokerName=localhost");
+
+        QueueViewMBean queue = (QueueViewMBean)MBeanServerInvocationHandler.newProxyInstance(mbeanServer, queueViewMBeanName, QueueViewMBean.class, true);
+
+        CompositeData[] compdatalist = queue.browse();
+        int initialQueueSize = compdatalist.length;
+        if (initialQueueSize == 0) {
+            fail("There is no message in the queue:");
+        }
+        else {
+            echo("Current queue size: " + initialQueueSize);
+        }
+        // TODO uncommenting this line causes a hang!
+        //int messageCount = initialQueueSize;
+        int messageCount = 10;
+        String[] messageIDs = new String[messageCount];
+        for (int i = 0; i < messageCount; i++) {
+            CompositeData cdata = compdatalist[i];
+            String messageID = (String) cdata.get("JMSMessageID");
+            assertNotNull("Should have a message ID for message " + i, messageID);
+            messageIDs[i] = messageID;
+        }
+
+
+        echo("About to move " + messageCount + " messages");
+
+        String newDestination = getSecondDestinationString();
+        for (String messageID : messageIDs) {
+            echo("Moving message: " + messageID);
+            queue.moveMessageTo(messageID, newDestination);
+        }
+
+        echo("Now browsing the queue");
+        compdatalist = queue.browse();
+        int actualCount = compdatalist.length;
+        echo("Current queue size: " + actualCount);
+        // TODO we seem to have browsed the queue and now there are messages missing!
+        //assertEquals("Should now have empty queue but was", initialQueueSize - messageCount, actualCount);
+
+        echo("Now browsing the second queue");
+
+        queueViewMBeanName = assertRegisteredObjectName(domain + ":Type=Queue,Destination=" + newDestination + ",BrokerName=localhost");
+        queue = (QueueViewMBean)MBeanServerInvocationHandler.newProxyInstance(mbeanServer, queueViewMBeanName, QueueViewMBean.class, true);
+
+        long newQueuesize = queue.getQueueSize();
+        echo("Second queue size: " + newQueuesize);
+        assertEquals("Unexpected number of messages ",messageCount, newQueuesize);
+    }
+
+    public void TODO_testRetryMessages() throws Exception {
+        // lets speed up redelivery
+        ActiveMQConnectionFactory factory = (ActiveMQConnectionFactory) connectionFactory;
+        factory.getRedeliveryPolicy().setCollisionAvoidancePercent((short) 0);
+        factory.getRedeliveryPolicy().setMaximumRedeliveries(1);
+        factory.getRedeliveryPolicy().setInitialRedeliveryDelay(0);
+        factory.getRedeliveryPolicy().setUseCollisionAvoidance(false);
+        factory.getRedeliveryPolicy().setUseExponentialBackOff(false);
+        factory.getRedeliveryPolicy().setBackOffMultiplier((short) 0);
+
+        connection = connectionFactory.createConnection();
+        useConnection(connection);
+
+
+        ObjectName queueViewMBeanName = assertRegisteredObjectName(domain + ":Type=Queue,Destination=" + getDestinationString() + ",BrokerName=localhost");
+        QueueViewMBean queue = (QueueViewMBean)MBeanServerInvocationHandler.newProxyInstance(mbeanServer, queueViewMBeanName, QueueViewMBean.class, true);
+
+        long initialQueueSize = queue.getQueueSize();
+        echo("current queue size: " + initialQueueSize);
+
+
+        // lets create a duff consumer which keeps rolling back...
+        Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
+        MessageConsumer consumer = session.createConsumer(new ActiveMQQueue(getDestinationString()));
+        Message message = consumer.receive(5000);
+        while (message != null) {
+            echo("Message: " + message.getJMSMessageID() + " redelivered " + message.getJMSRedelivered() + " counter " + message.getObjectProperty("JMSXDeliveryCount"));
+            session.rollback();
+            message = consumer.receive(2000);
+        }
+        consumer.close();
+        session.close();
+
+
+        // now lets get the dead letter queue
+        Thread.sleep(1000);
+
+        ObjectName dlqQueueViewMBeanName = assertRegisteredObjectName(domain + ":Type=Queue,Destination=" + SharedDeadLetterStrategy.DEFAULT_DEAD_LETTER_QUEUE_NAME + ",BrokerName=localhost");
+        QueueViewMBean dlq = (QueueViewMBean)MBeanServerInvocationHandler.newProxyInstance(mbeanServer, dlqQueueViewMBeanName, QueueViewMBean.class, true);
+
+        long initialDlqSize = dlq.getQueueSize();
+        CompositeData[] compdatalist = dlq.browse();
+        int dlqQueueSize = compdatalist.length;
+        if (dlqQueueSize == 0) {
+            fail("There are no messages in the queue:");
+        }
+        else {
+            echo("Current DLQ queue size: " + dlqQueueSize);
+        }
+
+        // TODO uncommenting this line causes a hang!
+        //int messageCount = dlqQueueSize;
+        int messageCount = 10;
+        String[] messageIDs = new String[messageCount];
+        for (int i = 0; i < messageCount; i++) {
+            CompositeData cdata = compdatalist[i];
+            String messageID = (String) cdata.get("JMSMessageID");
+            assertNotNull("Should have a message ID for message " + i, messageID);
+            messageIDs[i] = messageID;
+        }
+
+
+        echo("About to retry " + messageCount + " messages");
+
+        for (String messageID : messageIDs) {
+            echo("Retrying message: " + messageID);
+            dlq.retryMessage(messageID);
+        }
+
+        long queueSize = queue.getQueueSize();
+        compdatalist = queue.browse();
+        int actualCount = compdatalist.length;
+        echo("Orginal queue size is now " + queueSize);
+        echo("Original browse queue size: " + actualCount);
+
+        long dlqSize = dlq.getQueueSize();
+        echo("DLQ size: " + dlqSize);
+
+        assertEquals("DLQ size", initialDlqSize - messageCount, dlqSize);
+        assertEquals("queue size", initialQueueSize, queueSize);
+        assertEquals("browse queue size", initialQueueSize, actualCount);
+    }
+
     public void testMoveMessagesBySelector() throws Exception {
         connection = connectionFactory.createConnection();
         useConnection(connection);
@@ -89,7 +228,7 @@
 
         QueueViewMBean queue = (QueueViewMBean)MBeanServerInvocationHandler.newProxyInstance(mbeanServer, queueViewMBeanName, QueueViewMBean.class, true);
 
-        String newDestination = "test.new.destination." + getClass() + "." + getName();
+        String newDestination = getSecondDestinationString();
         queue.moveMatchingMessagesTo("counter > 2", newDestination);
 
         queueViewMBeanName = assertRegisteredObjectName(domain + ":Type=Queue,Destination=" + newDestination + ",BrokerName=localhost");
@@ -112,7 +251,7 @@
 
         QueueViewMBean queue = (QueueViewMBean)MBeanServerInvocationHandler.newProxyInstance(mbeanServer, queueViewMBeanName, QueueViewMBean.class, true);
 
-        String newDestination = "test.new.destination." + getClass() + "." + getName();
+        String newDestination = getSecondDestinationString();
         long queueSize = queue.getQueueSize();
         queue.copyMatchingMessagesTo("counter > 2", newDestination);
 
@@ -375,10 +514,10 @@
 
     protected BrokerService createBroker() throws Exception {
         BrokerService answer = new BrokerService();
+        answer.setPersistent(false);
         answer.setDeleteAllMessagesOnStartup(true);
         answer.setUseJmx(true);
         //answer.setEnableStatistics(true);
-        answer.setPersistent(false);
         answer.addConnector(bindAddress);
         return answer;
     }
@@ -404,4 +543,9 @@
     protected void echo(String text) {
         LOG.info(text);
     }
+
+
+    protected String getSecondDestinationString() {
+        return "test.new.destination." + getClass() + "." + getName();
+    }
 }