Can't unsubscribe a durable subscription when there's a virtual topic present 
on the broker
-------------------------------------------------------------------------------------------

                 Key: AMQ-2144
                 URL: https://issues.apache.org/activemq/browse/AMQ-2144
             Project: ActiveMQ
          Issue Type: Bug
          Components: Broker
    Affects Versions: 5.2.0
         Environment: Ubuntu
            Reporter: Cláudio de Miranda Luz


The scenario is:

There's a virtual topic being used. (i.e. topic VirtualTopic.Orders).

A consumer subscribes to any topic present on the broker and after some time it 
tries to unsubscribe the durable subscription.

When it calls session.unsubscribe(consumerName) to unsubscribe a durable 
subscription, it receives the following exception:

Caught: javax.jms.JMSException: 
org.apache.activemq.broker.region.virtual.VirtualTopicInterceptor cannot be 
cast to org.apache.activemq.broker.region.Topic
javax.jms.JMSException: 
org.apache.activemq.broker.region.virtual.VirtualTopicInterceptor cannot be 
cast to org.apache.activemq.broker.region.Topic
        at 
org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49)
        at 
org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1244)
        at 
org.apache.activemq.ActiveMQConnection.unsubscribe(ActiveMQConnection.java:2052)
        at 
org.apache.activemq.ActiveMQSession.unsubscribe(ActiveMQSession.java:1431)
        at DurableSubscriber.consumeMessagesAndClose(DurableSubscriber.java:206)
        at DurableSubscriber.run(DurableSubscriber.java:112)
        at DurableSubscriber.main(DurableSubscriber.java:70)
Caused by: java.lang.ClassCastException: 
org.apache.activemq.broker.region.virtual.VirtualTopicInterceptor cannot be 
cast to org.apache.activemq.broker.region.Topic
        at 
org.apache.activemq.broker.region.TopicRegion.removeSubscription(TopicRegion.java:139)
        at 
org.apache.activemq.broker.region.RegionBroker.removeSubscription(RegionBroker.java:409)
        at 
org.apache.activemq.broker.BrokerFilter.removeSubscription(BrokerFilter.java:98)
        at 
org.apache.activemq.broker.BrokerFilter.removeSubscription(BrokerFilter.java:98)
        at 
org.apache.activemq.broker.BrokerFilter.removeSubscription(BrokerFilter.java:98)
        at 
org.apache.activemq.broker.MutableBrokerFilter.removeSubscription(MutableBrokerFilter.java:105)
        at 
org.apache.activemq.broker.TransportConnection.processRemoveSubscription(TransportConnection.java:339)
        at 
org.apache.activemq.command.RemoveSubscriptionInfo.visit(RemoveSubscriptionInfo.java:83)
        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.TransportFilter.onCommand(TransportFilter.java:68)
        at 
org.apache.activemq.transport.WireFormatNegotiator.onCommand(WireFormatNegotiator.java:143)
        at 
org.apache.activemq.transport.InactivityMonitor.onCommand(InactivityMonitor.java:206)
        at 
org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:84)
        at 
org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:203)
        at 
org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:185)
        at java.lang.Thread.run(Thread.java:619)


The error happens on the following method of 
org.apache.activemq.broker.region.TopicRegion class:

    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");
        }

        durableSubscriptions.remove(key);
        synchronized (destinationsMutex) {
            for (Iterator<Destination> iter = destinations.values().iterator(); 
iter.hasNext();) {
                Topic topic = (Topic)iter.next();
                topic.deleteSubscription(context, key);
            }
        }
        super.removeConsumer(context, sub.getConsumerInfo());
    }

The virtual topic is present on the destinations collection being iterated but 
its type is not Topic and that is what causes the error.

If there is no virtual topics present on the broker, unsubscriptions work well.




-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to