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