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
            Priority: Minor


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

        

Reply via email to