[ https://issues.apache.org/jira/browse/AMQ-3674?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Timothy Bish resolved AMQ-3674. ------------------------------- Resolution: Fixed Fix Version/s: 5.6.0 Assignee: Timothy Bish Simplified the test case and patch a little and applied. Thanks! > TopicRegion removes durableScriber from durableSubscriptions when it is > active; but leaves subscription on Topic > ---------------------------------------------------------------------------------------------------------------- > > Key: AMQ-3674 > URL: https://issues.apache.org/jira/browse/AMQ-3674 > Project: ActiveMQ > Issue Type: Bug > Components: Broker > Affects Versions: 5.5.1 > Environment: 5.5.1 (5.5.1-fuse-01-20), Mac OS X 10.7.2 (11.2.0 Darwin > Kernel Version 11.2.0) > Reporter: Dominic Tootell > Assignee: Timothy Bish > Priority: Minor > Labels: Topic > Fix For: 5.6.0 > > Attachments: RemoveDurableSubscriptionTest.java, > TopicRegion.AMQ-3674.patch.txt > > > http://svn.apache.org/viewvc/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/region/TopicRegion.java?revision=1160894&view=markup > Via the Web Admin Console you can attempt to remove a durable topic > subscription when it is active; however you will receive the message: > "Durable consumer is in use". However, there is unfortunate side effect of > this attempt in that the *{{durableSubscriptions}}* map is modified and the > subscription is removed from the map, and the topic is left with > subscription. If you subsequentially then disconnect the active durable > topic consumer (so it's in an active state; where you and attempt to remove > the subscription), you cannot remove the inactive subscription as you hit: > "No durable subscription exists for:" > {noformat} > @Override > public void removeSubscription(ConnectionContext context, > RemoveSubscriptionInfo info) throws Exception { > SubscriptionKey key = new SubscriptionKey(info.getClientId(), > info.getSubscriptionName()); > DurableTopicSubscription sub = durableSubscriptions.remove(key); > if (sub == null) { > throw new InvalidDestinationException("No durable subscription > exists for: " + info.getSubscriptionName()); > } > if (sub.isActive()) { > throw new JMSException("Durable consumer is in use"); > } > {noformat} > The above maybe should be changed to, where the subscription is *{{get}}* > from the map, and only removed if it's !sub.isActive(). (Or perhaps re add > the subscription to the map if it is Active) > {noformat} > @Override > public void removeSubscription(ConnectionContext context, > RemoveSubscriptionInfo info) throws Exception { > SubscriptionKey key = new SubscriptionKey(info.getClientId(), > info.getSubscriptionName()); > DurableTopicSubscription sub = durableSubscriptions.get(key); > if (sub == null) { > throw new InvalidDestinationException("No durable subscription > exists for: " + info.getSubscriptionName()); > } > if (sub.isActive()) { > throw new JMSException("Durable consumer is in use"); > } > if(sub!=null) { > durableSubscriptions.remove(key); > } > {noformat} > let me know if that makes no sense; and i'll try to create you a sample unit > test. > cheers > /dom -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa For more information on JIRA, see: http://www.atlassian.com/software/jira