Multiple durable topics don't work with network of brokers
----------------------------------------------------------

         Key: AMQ-687
         URL: https://issues.apache.org/activemq/browse/AMQ-687
     Project: ActiveMQ
        Type: Bug

  Components: Broker  
    Versions: 4.0 RC 2    
 Environment: AMQ RC2, Solaris 8 / 10, JDK 1.5
    Reporter: Kevin Yaussy
    Priority: Critical


There is a problem with a network of brokers with regards to a single consumer 
subscribing to multiple durable topics.  

To recreate the issue, I changed examples/ConsumerTool.java to subscribe to two 
durable topics, with the createDurableSubscriber calls changed to look like 
this:
                consumer = session.createDurableSubscriber(topic1, 
topic1.getTopicName() );
                consumer2 = session.createDurableSubscriber( topic2, 
topic2.getTopicName() );
This ensures that the name of the durable subscriptions are unique, rather than 
using the "consumerName" as the base example code does.

The problem is with any remote brokers: it appears that the broker-to-broker 
code for durable subscriptions does not *uniquely* set the subscription name 
for multiple durable subscriptions to different topics.  Here is the message 
and exception information from the remote broker:

<INFO> <org.apache.activemq.broker.AbstractConnection.Service> < Mon 2006/04/10 
10:50:52:660 > <org.apache.activemq.broker.AbstractConnection.se
rviceException> <Thread[tcp://sbtmdgca/170.137.15.64:61618,5,main]> Async error 
occurred: javax.jms.JMSException: Durable consumer is in use for
 client: NC_ProdDN3AsbtmdgcasbtmdgcAMQDN_inboundProdDN3Bsbtgc0bsbtgc0AMQDN and 
subscriptionName: ProdDN3Bsbtgc0bsbtgc0AMQDN
<INFO> Stack Trace follows:
javax.jms.JMSException: Durable consumer is in use for client: 
NC_ProdDN3AsbtmdgcasbtmdgcAMQDN_inboundProdDN3Bsbtgc0bsbtgc0AMQDN and 
subscriptio
nName: ProdDN3Bsbtgc0bsbtgc0AMQDN
        at 
org.apache.activemq.broker.region.TopicRegion.addConsumer(TopicRegion.java:81)
        at 
org.apache.activemq.broker.region.RegionBroker.addConsumer(RegionBroker.java:276)
        at 
org.apache.activemq.broker.BrokerFilter.addConsumer(BrokerFilter.java:69)
        at 
org.apache.activemq.advisory.AdvisoryBroker.addConsumer(AdvisoryBroker.java:75)
        at 
org.apache.activemq.broker.BrokerFilter.addConsumer(BrokerFilter.java:69)
        at 
org.apache.activemq.broker.MutableBrokerFilter.addConsumer(MutableBrokerFilter.java:81)
        at 
org.apache.activemq.broker.AbstractConnection.processAddConsumer(AbstractConnection.java:422)
        at org.apache.activemq.command.ConsumerInfo.visit(ConsumerInfo.java:291)
        at 
org.apache.activemq.broker.AbstractConnection.service(AbstractConnection.java:196)
        at 
org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:62)
        at 
org.apache.activemq.transport.ResponseCorrelator.onCommand(ResponseCorrelator.java:88)
        at 
org.apache.activemq.transport.TransportFilter.onCommand(TransportFilter.java:70)
        at 
org.apache.activemq.transport.vm.VMTransport.oneway(VMTransport.java:75)
        at 
org.apache.activemq.transport.MutexTransport.oneway(MutexTransport.java:44)
        at 
org.apache.activemq.transport.ResponseCorrelator.oneway(ResponseCorrelator.java:55)
        at 
org.apache.activemq.network.DemandForwardingBridgeSupport.addSubscription(DemandForwardingBridgeSupport.java:344)
        at 
org.apache.activemq.network.DemandForwardingBridgeSupport.serviceRemoteConsumerAdvisory(DemandForwardingBridgeSupport.java:324)
        at 
org.apache.activemq.network.DemandForwardingBridgeSupport.serviceRemoteCommand(DemandForwardingBridgeSupport.java:274)
        at 
org.apache.activemq.network.DemandForwardingBridgeSupport$2.onCommand(DemandForwardingBridgeSupport.java:120)
        at 
org.apache.activemq.transport.ResponseCorrelator.onCommand(ResponseCorrelator.java:88)
        at 
org.apache.activemq.transport.TransportFilter.onCommand(TransportFilter.java:70)
        at 
org.apache.activemq.transport.failover.FailoverTransport$1.onCommand(FailoverTransport.java:103)
        at 
org.apache.activemq.transport.WireFormatNegotiator.onCommand(WireFormatNegotiator.java:114)
        at 
org.apache.activemq.transport.InactivityMonitor.onCommand(InactivityMonitor.java:122)
        at 
org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:87)
        at 
org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:139)
        at java.lang.Thread.run(Thread.java:595)


You can see that the "subscriptionName" used from the originating broker is the 
brokerName.  This will never handle multiple durable subscriptions (different 
topics) from the same consumer.

Perhaps in addition to the brokerName, the original topic name could be used?  
Or, just the topic name, since clientId is supposed to make it unique anyway.


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   https://issues.apache.org/activemq/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to