[
https://issues.apache.org/activemq/browse/AMQ-2051?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Gary Tully resolved AMQ-2051.
-----------------------------
Resolution: Fixed
patch applied and modified test included, thanks. r734524
The remove implementation takes a timeout option, if the timeout is 0, it
errors if there are consumers.
if the timeout > 0 it removes the subscribers and disposes the queue, which
should purge the queue.
So to Davids question, I guess a removeDestination where the destination has
messages should delete the messages, that is purge the store.
> 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
> Assignee: Gary Tully
> 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.