Author: gtully
Date: Wed Jan 14 13:53:02 2009
New Revision: 734524

URL: http://svn.apache.org/viewvc?rev=734524&view=rev
Log:
resolve https://issues.apache.org/activemq/browse/AMQ-2051 - allow remove after 
remove failure

Added:
    
activemq/trunk/activemq-core/src/test/java/org/apache/activemq/RemoveDestinationTest.java
   (with props)
Modified:
    
activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java

Modified: 
activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java
URL: 
http://svn.apache.org/viewvc/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java?rev=734524&r1=734523&r2=734524&view=diff
==============================================================================
--- 
activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java
 (original)
+++ 
activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java
 Wed Jan 14 13:53:02 2009
@@ -280,7 +280,7 @@
 
     public void removeDestination(ConnectionContext context, 
ActiveMQDestination destination, long timeout) throws Exception {
 
-        if (destinations.remove(destination) != null) {
+        if (destinations.containsKey(destination)) {
             switch (destination.getDestinationType()) {
             case ActiveMQDestination.QUEUE_TYPE:
                 queueRegion.removeDestination(context, destination, timeout);
@@ -297,6 +297,7 @@
             default:
                 throw createUnknownDestinationTypeException(destination);
             }
+            destinations.remove(destination);
         }
 
     }

Added: 
activemq/trunk/activemq-core/src/test/java/org/apache/activemq/RemoveDestinationTest.java
URL: 
http://svn.apache.org/viewvc/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/RemoveDestinationTest.java?rev=734524&view=auto
==============================================================================
--- 
activemq/trunk/activemq-core/src/test/java/org/apache/activemq/RemoveDestinationTest.java
 (added)
+++ 
activemq/trunk/activemq-core/src/test/java/org/apache/activemq/RemoveDestinationTest.java
 Wed Jan 14 13:53:02 2009
@@ -0,0 +1,166 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq;
+
+import java.net.URI;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.JMSException;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+import javax.jms.Topic;
+import javax.jms.TextMessage;
+import javax.management.ObjectName;
+
+import org.apache.activemq.ActiveMQConnection;
+import org.apache.activemq.advisory.DestinationSource;
+import org.apache.activemq.broker.BrokerFactory;
+import org.apache.activemq.broker.BrokerService;
+import org.apache.activemq.command.ActiveMQDestination;
+import org.apache.activemq.command.ActiveMQTopic;
+
+import junit.framework.TestCase;
+
+public class RemoveDestinationTest extends TestCase {
+
+    private static final String VM_BROKER_URL = "vm://localhost?create=false";
+    private static final String BROKER_URL = 
"broker:vm://localhost?broker.persistent=false&broker.useJmx=true";
+    
+    BrokerService broker;
+    
+    public RemoveDestinationTest(String name) {
+        super(name);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        
+        broker = BrokerFactory.createBroker(new URI(BROKER_URL));
+        broker.start();
+        
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        broker.stop();
+    }
+
+    private Connection createConnection(final boolean start) throws 
JMSException {
+        ConnectionFactory cf = new ActiveMQConnectionFactory(VM_BROKER_URL);
+        Connection conn = cf.createConnection();
+        if (start) {
+            conn.start();
+        }
+        return conn;
+    }
+
+    public void testRemoveDestinationWithoutSubscriber() throws Exception {
+
+        ActiveMQConnection amqConnection = (ActiveMQConnection) 
createConnection(true);
+        DestinationSource destinationSource = 
amqConnection.getDestinationSource();
+        Session session = amqConnection.createSession(false, 
Session.AUTO_ACKNOWLEDGE);
+        Topic topic = session.createTopic("TEST.FOO");
+        MessageProducer producer = session.createProducer(topic);
+        MessageConsumer consumer = session.createConsumer(topic);
+
+        TextMessage msg = session.createTextMessage("Hellow World");
+        producer.send(msg);
+        assertNotNull( consumer.receive( 5000 ) );
+        Thread.sleep( 1000 );
+
+        ActiveMQTopic amqTopic = (ActiveMQTopic)topic;
+        assertTrue( destinationSource.getTopics().contains(amqTopic) );
+
+        consumer.close();
+        producer.close();
+        session.close();
+
+        Thread.sleep( 3000 );
+        
+        amqConnection.destroyDestination( (ActiveMQDestination)topic );
+        
+        Thread.sleep( 3000 );
+
+        assertFalse( destinationSource.getTopics().contains(amqTopic) );
+    }
+
+    public void testRemoveDestinationWithSubscriber() throws Exception {
+        ActiveMQConnection amqConnection = (ActiveMQConnection) 
createConnection(true);
+        DestinationSource destinationSource = 
amqConnection.getDestinationSource();
+        
+        Session session = amqConnection.createSession(false, 
Session.AUTO_ACKNOWLEDGE);
+        Topic topic = session.createTopic("TEST.FOO");
+        MessageProducer producer = session.createProducer(topic);
+        MessageConsumer consumer = session.createConsumer(topic);
+
+        TextMessage msg = session.createTextMessage("Hellow World");
+        producer.send(msg);
+        assertNotNull( consumer.receive( 5000 ) );
+        Thread.sleep( 1000 );
+
+        ActiveMQTopic amqTopic = (ActiveMQTopic)topic;
+
+        assertTrue(destinationPresentInAdminView(broker, amqTopic));
+        
+        assertTrue( destinationSource.getTopics().contains(amqTopic) );
+
+        // This line generates a broker error since the consumer is still 
active.
+        try{
+            amqConnection.destroyDestination( (ActiveMQDestination)topic );
+            fail("expect exception on destroy if comsumer present");
+        } catch( JMSException expected ) {
+            assertTrue(expected.getMessage().indexOf(amqTopic.getTopicName()) 
!= -1);
+        }
+
+        Thread.sleep( 3000 );
+
+        assertTrue( destinationSource.getTopics().contains(amqTopic) );
+        assertTrue(destinationPresentInAdminView(broker, amqTopic));
+        
+        consumer.close();
+        producer.close();
+        session.close();
+
+        Thread.sleep( 3000 );
+
+        // The destination will not be removed with this call, but if you 
remove the call
+        // above that generates the error it will.
+        amqConnection.destroyDestination( amqTopic );
+
+        Thread.sleep( 3000 );
+
+        assertFalse( destinationSource.getTopics().contains(amqTopic) );
+        assertFalse(destinationPresentInAdminView(broker, amqTopic));
+        
+    }
+
+    private boolean destinationPresentInAdminView(BrokerService broker2,
+            ActiveMQTopic amqTopic) throws Exception {
+        boolean found = false;
+        for (ObjectName name : broker.getAdminView().getTopics()) {
+            if (name.getKeyProperty("Destination") != null &&
+                    
name.getKeyProperty("Destination").equalsIgnoreCase(amqTopic.getTopicName())) {
+                found = true;
+                break;
+            }   
+        }
+        return found;
+    }
+}
+

Propchange: 
activemq/trunk/activemq-core/src/test/java/org/apache/activemq/RemoveDestinationTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
activemq/trunk/activemq-core/src/test/java/org/apache/activemq/RemoveDestinationTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date


Reply via email to