Return-Path: Delivered-To: apmail-activemq-dev-archive@www.apache.org Received: (qmail 3924 invoked from network); 31 Dec 2008 22:51:26 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 31 Dec 2008 22:51:26 -0000 Received: (qmail 62205 invoked by uid 500); 31 Dec 2008 22:51:26 -0000 Delivered-To: apmail-activemq-dev-archive@activemq.apache.org Received: (qmail 62184 invoked by uid 500); 31 Dec 2008 22:51:26 -0000 Mailing-List: contact dev-help@activemq.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@activemq.apache.org Delivered-To: mailing list dev@activemq.apache.org Received: (qmail 62173 invoked by uid 99); 31 Dec 2008 22:51:26 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 31 Dec 2008 14:51:26 -0800 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.140] (HELO brutus.apache.org) (140.211.11.140) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 31 Dec 2008 22:51:25 +0000 Received: from brutus (localhost [127.0.0.1]) by brutus.apache.org (Postfix) with ESMTP id 676E2234C46D for ; Wed, 31 Dec 2008 14:51:05 -0800 (PST) Message-ID: <1744345470.1230763865409.JavaMail.jira@brutus> Date: Wed, 31 Dec 2008 14:51:05 -0800 (PST) From: "Timothy Bish (JIRA)" To: dev@activemq.apache.org Subject: [jira] Updated: (AMQ-2051) Removing a Destination with active subscribers causes the destination to be unable to be removed. In-Reply-To: <1375008057.1230763385498.JavaMail.jira@brutus> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Virus-Checked: Checked by ClamAV on apache.org [ https://issues.apache.org/activemq/browse/AMQ-2051?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Timothy Bish updated AMQ-2051: ------------------------------ Attachment: removeDestinationPatch.txt Potential Patch for this issue. Probably need someone with more knowledge of the broker internals to ensure this won't break anything. > Removing a Destination with active subscribers causes the destination to be unable to be removed. > ------------------------------------------------------------------------------------------------- > > Key: AMQ-2051 > URL: https://issues.apache.org/activemq/browse/AMQ-2051 > Project: ActiveMQ > Issue Type: Bug > Components: Broker > Affects Versions: 5.1.0, 5.2.0 > Reporter: Timothy Bish > Priority: Minor > Fix For: 5.3.0 > > Attachments: removeDestinationPatch.txt, RemoveDestinationTest.java > > > While attempting to implement destination removal in the ActiveMQ-CPP client I noticed that when attempting to remove destination that had active subscribers the destination would be placed in a state that they could not be removed once the subscribers had all been removed. > Sending a DestinationInfo command to the Broker while keeping my consumer open results in an exception which is expected since there are still subscribers. > {noformat} > javax.jms.JMSException: Destination still has an active subscription: topic://TEST.FOO > at org.apache.activemq.broker.region.AbstractRegion.removeDestination(AbstractRegion.java:158) > at org.apache.activemq.broker.jmx.ManagedTopicRegion.removeDestination(ManagedTopicRegion.java:62) > at org.apache.activemq.broker.region.RegionBroker.removeDestination(RegionBroker.java:289) > at org.apache.activemq.broker.region.RegionBroker.removeDestinationInfo(RegionBroker.java:312) > at org.apache.activemq.broker.BrokerFilter.removeDestinationInfo(BrokerFilter.java:218) > at org.apache.activemq.broker.BrokerFilter.removeDestinationInfo(BrokerFilter.java:218) > at org.apache.activemq.advisory.AdvisoryBroker.removeDestinationInfo(AdvisoryBroker.java:193) > at org.apache.activemq.broker.BrokerFilter.removeDestinationInfo(BrokerFilter.java:218) > at org.apache.activemq.broker.MutableBrokerFilter.removeDestinationInfo(MutableBrokerFilter.java:226) > at org.apache.activemq.broker.TransportConnection.processRemoveDestination(TransportConnection.java:481) > at org.apache.activemq.command.DestinationInfo.visit(DestinationInfo.java:124) > at org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:305) > at org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:179) > at org.apache.activemq.transport.ResponseCorrelator.onCommand(ResponseCorrelator.java:104) > at org.apache.activemq.transport.TransportFilter.onCommand(TransportFilter.java:68) > at org.apache.activemq.transport.vm.VMTransport.iterate(VMTransport.java:205) > at org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:122) > at org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:43) > at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) > at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) > at java.lang.Thread.run(Thread.java:619) > {noformat} > Once I removed my consumer and sent the command again I got no errors indicating that it couldn't be removed, however I could still see the Destination in the Web Console. > Looking into the Broker code I see that the RegionBroker class processes a removeDestination call by first removing the Destination from its map of Destinations and then attempting to remove it from the Region that it belongs to. If this call fails the code will never again attempt to remove a Destination since its removed from the RegionBroker's map but it may not be removed from the specific region it resides in. The code looks like it should first attempt to remove the Destination from the region before removing from its map, the addDestination method works in that way, adding it to region before adding it to its map so that if an exception occurs nothing is added. > RegionBroker.java : around line 283 > {noformat| > public void removeDestination(ConnectionContext context, ActiveMQDestination destination, long timeout) throws Exception { > if (destinations.remove(destination) != null) { > switch (destination.getDestinationType()) { > case ActiveMQDestination.QUEUE_TYPE: > queueRegion.removeDestination(context, destination, timeout); > break; > case ActiveMQDestination.TOPIC_TYPE: > topicRegion.removeDestination(context, destination, timeout); > break; > case ActiveMQDestination.TEMP_QUEUE_TYPE: > tempQueueRegion.removeDestination(context, destination, timeout); > break; > case ActiveMQDestination.TEMP_TOPIC_TYPE: > tempTopicRegion.removeDestination(context, destination, timeout); > break; > default: > throw createUnknownDestinationTypeException(destination); > } > } > } > {noformat} -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.