activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Dominic Tootell (Created) (JIRA)" <j...@apache.org>
Subject [jira] [Created] (AMQ-3674) TopicRegion removes durableScriber from durableSubscriptions when it is active; but leaves subscription on Topic
Date Sun, 22 Jan 2012 17:58:39 GMT
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

        

Mime
View raw message