Uploaded image for project: 'ActiveMQ Classic'
  1. ActiveMQ Classic
  2. AMQ-4797

Unable to add multiple AJAX listeners for the same topic in the same browser window

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Abandoned
    • 5.8.0
    • None
    • None
    • Windows Server 2008 R2 on Dell server boxes

    Description

      I'm using ExtJS to create two separate panels which run in one browser tab. After loading jquery, amq_jquery_adapter.js and amq.js I call amq_init (only once). Then each panel calls addlistener like so:

      Panel 1 code:

      amq.addListener('testconnection1', topic://MyApp/IOIs/Simulator', myHandler1.rcvMessage);

      Panel 2 code:

      amq.addListener('testconnection2', 'topic://MyApp/IOIs/Simulator', myHandler2.rcvMessage);

      Note that both are subscribing to the same topic. This is because Panel 1 shows the data in a different format than Panel 2.

      The Problem:
      If I start Panel 1 alone, it receives data from the topic without problems. But then I start Panel 2 and as soon as it executes the addlistener, Panel 2 starts receiving data but Panel 1 stops!

      So I started tracing into the network traffic and all looks fine, i.e, I can see each addlistener trigger a 'listen' request with the proper id and topic. And I see the amq server return data to testconnection1, then stop suddenly when the 'listen' for testconnection2 is sent. So I turned my attention to the backend code and enabled a detailed trace. Here's what I found:

      When the Panel 1 'listen' is received, the trace shows:

      2013-10-10 09:10:09,701 | DEBUG | 0 destination=topic://MyApp/IOIs/Simulator message=testconnection1 type=listen | org.apache.activemq.web.MessageListenerServlet | qtp2088898587-51 - /demo/amq
      2013-10-10 09:10:09,701 | DEBUG | topic://MyApp/IOIs/Simulator is a org.apache.activemq.command.ActiveMQTopic | org.apache.activemq.web.MessageListenerServlet | qtp2088898587-51 - /demo/amq
      2013-10-10 09:10:09,701 | DEBUG | amq-broker adding consumer: ID:MYAPPDATA-7392-1381410590247-5:1:1:1 for destination: topic://MyApp/IOIs/Simulator | org.apache.activemq.broker.region.AbstractRegion | ActiveMQ VMTransport: vm://localhost#1-2
      2013-10-10 09:10:09,701 | DEBUG | amq-broker adding destination: topic://ActiveMQ.Advisory.Consumer.Topic.MyApp/IOIs/Simulator | org.apache.activemq.broker.region.AbstractRegion | ActiveMQ VMTransport: vm://localhost#1-2
      2013-10-10 09:10:09,717 | DEBUG | Initialized TaskRunnerFactory[ActiveMQ Session Task] using ExecutorService: java.util.concurrent.ThreadPoolExecutor@2e2667db[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0] | org.apache.activemq.thread.TaskRunnerFactory | qtp2088898587-51 - /demo/amq
      2013-10-10 09:10:09,717 | DEBUG | Subscribed: ActiveMQMessageConsumer

      Unknown macro: { value=ID}

      to topic://MyApp/IOIs/Simulator id=testconnection1 | org.apache.activemq.web.MessageListenerServlet | qtp2088898587-51 - /demo/amq

      When the Panel 2 'listen' is received, I see this trace:

      2013-10-10 09:10:09,888 | DEBUG | 0 destination=topic://MyApp/IOIs/Simulator message=testconnection2 type=listen | org.apache.activemq.web.MessageListenerServlet | qtp2088898587-53 - /demo/amq
      2013-10-10 09:10:09,888 | DEBUG | topic://MyApp/IOIs/Simulator is a org.apache.activemq.command.ActiveMQTopic | org.apache.activemq.web.MessageListenerServlet | qtp2088898587-53 - /demo/amq
      2013-10-10 09:10:09,888 | DEBUG | remove: ID:MYAPPDATA-7392-1381410590247-5:1:1:1, lastDeliveredSequenceId:0 | org.apache.activemq.ActiveMQMessageConsumer | qtp2088898587-53 - /demo/amq
      2013-10-10 09:10:09,888 | DEBUG | Unregistering MBean org.apache.activemq:type=Broker,brokerName=amq-broker,destinationType=Topic,destinationName=MyApp/IOIs/Simulator,endpoint=Consumer,clientId=ID_MYAPPDATA-7392-1381410590247-4_1,consumerId=ID_MYAPPDATA-7392-1381410590247-5_1_1_1 | org.apache.activemq.broker.jmx.ManagementContext | ActiveMQ VMTransport: vm://localhost#1-2
      2013-10-10 09:10:09,888 | DEBUG | amq-broker removing consumer: ID:MYAPPDATA-7392-1381410590247-5:1:1:1 for destination: topic://MyApp/IOIs/Simulator | org.apache.activemq.broker.region.AbstractRegion | ActiveMQ VMTransport: vm://localhost#1-2
      2013-10-10 09:10:09,888 | DEBUG | amq-broker adding consumer: ID:MYAPPDATA-7392-1381410590247-5:1:1:2 for destination: topic://MyApp/IOIs/Simulator | org.apache.activemq.broker.region.AbstractRegion | ActiveMQ VMTransport: vm://localhost#1-2
      2013-10-10 09:10:09,904 | DEBUG | Subscribed: ActiveMQMessageConsumer

      Unknown macro: { value=ID}

      to topic://MyApp/IOIs/Simulator id=testconnection2 | org.apache.activemq.web.MessageListenerServlet | qtp2088898587-53 - /demo/amq

      What is happening is that in MessageListenerServlet.js, function doPost, line 165 is dropping any previous consumer to the same destination:

      client.closeConsumer(destination); // drop any existing consumer.

      But why? There doesn't seem to be a good reason for doing this--maybe it was originally put there for cleanup purposes?. Or if there is a good reason, maybe the behavior should be to not do it if the id of the new destination (in this case 'testconnection2') is different than the id of the existing destination ('testconnection1').

      I believe this can be fixed by simply removing line 165 from MessageListenerServlet.js but I'm not sure if this will break something else.

      Attachments

        Activity

          People

            Unassigned Unassigned
            ptrader98 Bill Harts
            Votes:
            1 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: