You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ce...@apache.org on 2013/05/07 16:39:25 UTC

svn commit: r1479925 - in /activemq/trunk: activemq-broker/src/main/java/org/apache/activemq/broker/region/Topic.java activemq-unit-tests/src/test/java/org/apache/activemq/bugs/MessageExpirationReaperTest.java

Author: ceposta
Date: Tue May  7 14:39:25 2013
New Revision: 1479925

URL: http://svn.apache.org/r1479925
Log:
Fix for https://issues.apache.org/jira/browse/AMQ-4516 - Don't decrement topic enqueues when messages are expired
Removed the call to decrement the counters, and added unit test

Modified:
    activemq/trunk/activemq-broker/src/main/java/org/apache/activemq/broker/region/Topic.java
    activemq/trunk/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/MessageExpirationReaperTest.java

Modified: activemq/trunk/activemq-broker/src/main/java/org/apache/activemq/broker/region/Topic.java
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-broker/src/main/java/org/apache/activemq/broker/region/Topic.java?rev=1479925&r1=1479924&r2=1479925&view=diff
==============================================================================
--- activemq/trunk/activemq-broker/src/main/java/org/apache/activemq/broker/region/Topic.java (original)
+++ activemq/trunk/activemq-broker/src/main/java/org/apache/activemq/broker/region/Topic.java Tue May  7 14:39:25 2013
@@ -731,7 +731,6 @@ public class Topic extends BaseDestinati
         // AMQ-2586: Better to leave this stat at zero than to give the user
         // misleading metrics.
         // destinationStatistics.getMessages().decrement();
-        destinationStatistics.getEnqueues().decrement();
         destinationStatistics.getExpired().increment();
         MessageAck ack = new MessageAck();
         ack.setAckType(MessageAck.STANDARD_ACK_TYPE);

Modified: activemq/trunk/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/MessageExpirationReaperTest.java
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/MessageExpirationReaperTest.java?rev=1479925&r1=1479924&r2=1479925&view=diff
==============================================================================
--- activemq/trunk/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/MessageExpirationReaperTest.java (original)
+++ activemq/trunk/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/MessageExpirationReaperTest.java Tue May  7 14:39:25 2013
@@ -19,12 +19,7 @@ package org.apache.activemq.bugs;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 
-import javax.jms.ConnectionFactory;
-import javax.jms.MessageProducer;
-import javax.jms.Queue;
-import javax.jms.QueueBrowser;
-import javax.jms.Session;
-import javax.jms.TextMessage;
+import javax.jms.*;
 import javax.management.ObjectName;
 
 import org.apache.activemq.ActiveMQConnection;
@@ -34,6 +29,7 @@ import org.apache.activemq.broker.jmx.De
 import org.apache.activemq.broker.region.policy.PolicyEntry;
 import org.apache.activemq.broker.region.policy.PolicyMap;
 import org.apache.activemq.command.ActiveMQDestination;
+import org.apache.activemq.command.ActiveMQTopic;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -60,6 +56,7 @@ public class MessageExpirationReaperTest
 
         factory = createConnectionFactory();
         connection = (ActiveMQConnection) factory.createConnection();
+        connection.setClientID("test-connection");
         connection.start();
     }
 
@@ -135,6 +132,45 @@ public class MessageExpirationReaperTest
         assertEquals("Wrong inFlightCount: " + view.getInFlightCount(), 0, view.getInFlightCount());
     }
 
+    @Test
+    public void testExpiredMessagesOnTopic() throws Exception{
+        Session session = createSession();
+
+        // use a zero prefetch so messages don't go inflight
+        ActiveMQTopic destination = new ActiveMQTopic(destinationName + "?consumer.prefetchSize=0");
+
+        MessageProducer producer = session.createProducer(destination);
+
+        // should have a durable sub because it's a little tricky to get messages to expire in
+        // non-durable subs.. with durable subs, we can just expire in the topic using the expire
+        // period.. also.. durable sub has to be "inactive" for the expire checker to actually
+        // expire the messages
+        MessageConsumer consumer = session.createDurableSubscriber(destination, "test-durable");
+
+        producer.setTimeToLive(500);
+
+        final int count = 3;
+        // Send some messages with an expiration
+        for (int i = 0; i < count; i++) {
+            TextMessage message = session.createTextMessage("" + i);
+            producer.send(message);
+        }
+
+        DestinationViewMBean view = createView(destination);
+        // not expired yet...
+        assertEquals("Incorrect enqueue count", 3, view.getEnqueueCount() );
+
+        // close consumer so topic thinks consumer is inactive
+        consumer.close();
+
+        // Let the messages reach an expiry time
+        Thread.sleep(2000);
+
+        assertEquals("Incorrect inflight count: " + view.getInFlightCount(), 0, view.getInFlightCount());
+        assertEquals("Incorrect queue size count", 0, view.getQueueSize());
+        assertEquals("Incorrect expired size count", view.getEnqueueCount(), view.getExpiredCount());
+    }
+
     protected DestinationViewMBean createView(ActiveMQDestination destination) throws Exception {
         String domain = "org.apache.activemq";
         ObjectName name;