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.2.0, 5.1.0
Reporter: Timothy Bish
Priority: Minor
Fix For: 5.3.0
Attachments: 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.