[ https://issues.apache.org/activemq/browse/AMQ-2144?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Gary Tully reassigned AMQ-2144: ------------------------------- Assignee: Gary Tully > 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 > Assignee: Gary Tully > Attachments: AMQ-2144.txt > > > 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.