Uploaded image for project: 'ActiveMQ Artemis'
  1. ActiveMQ Artemis
  2. ARTEMIS-3357

Setting multicast: prefix explicitely when reconnecting a durable AMQP client causes the queue to be renewed and all pending messages lost

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 2.17.0, 2.27.1
    • 2.28.0
    • AMQP
    • None

    Description

      Hello!

       

      This issue was created after a discussion on the users@activemq.apache.org mailing list. Subject: 'Understanding of Artemis multicastPrefix in AMQP address prevents the transfer of historical and pending messages of queue' in June 2021.

      http://mail-archives.apache.org/mod_mbox/activemq-users/202106.mbox/%3Cbf67a06968df4b04a141edf382c5fc81%40NWMLMBX1004.ns.wpol.nl%3E

       

      Currently you may tell Artemis to auto-create a durable queue with AMQP by setting the source terminus to a durable value. This allows pending messages on the queue to be retrieved by the receiver on a reconnect. However, if you set the multicast: prefix explicitely and reconnect, the queue will be replaced by a queue with a new ID and all pending messages are lost.

       

      I have reproduced this issue both with the Artemis client binary and with an AMQP python proton client.

       

      Steps based on Artemis binary which shows behavior is limited to setting the multicast prefix explicitely:

      What I will show are 2 points: 1) The ALL command does not renew/overwrite the existing, durable subscription queue. Pending messages are received.  and 2) The NEW does renew/overwrite the existing, durable subscription queue. Pending messages are lost.

      Both situations appear to not influence each other as the order in which the 2 tests are tried do not matter.

       

      Startup every test:

      1. Configure the 'someUser' user with the amq role and password 'somePassword'
      2. Start Artemis 2.17.0 with the broker.xml from the link.
      3. Change directory to the Artemis binary.
      4. Login and open the management console at http://localhost:8161/console/artemis/artemisQueues?nid=root-org.apache.activemq.artemis-ARTEMIS in a browser (the Queues page) 4. Run this command in a separate terminal: ./artemis producer --user someUser --password somePassword --url amqp://localhost:5672 --sleep 1000 --protocol amqp --destination topic://foobar --verbose

       

      Cleanup every test:

      1. Close terminals
      2. Close management console.
      3. Quit Artemis.
      4. Remove persistent files e.g. docker container & volume.

       

      Test ALL:

      1. Run: ./artemis consumer --durable --protocol amqp --user someUser --password somePassword --clientID artemisconsoleALL --destination topic://foobar --url amqp://localhost:5672 --verbose 6. Note:

        - Messages are now being received in the terminal.

        - In the management console click reset and note that a queue is created with the name 'artemisconsoleALL.Consumer foobar, thread=0'.

        - The ID of the queue.

        - The queue is multicast.

        - The queue is durable.

      1. Quit the command with CTRL+C and wait a couple of seconds.
      2. Note that the messages on the queue is increasing in the management console.
      3. Run the command again to connect the receiver.
      4. Note that ALL pending messages are received. Note that the queue id in the management console did NOT change. Note that the queue in the management console now has 0 pending messages.

       

      Test NEW:

      1. Run: ./artemis consumer --durable --protocol amqp --user someUser --password somePassword --clientID artemisconsoleNEW --destination topic://multicast:foobar --url amqp://localhost:5672 --verbose 6. Note:

        - Messages are now being received in the terminal.

        - In the management console click reset and note that a queue is created with the name 'artemisconsoleNEW.Consumer multicast:foobar, thread=0'.

        - The ID of the queue.

        - The queue is multicast.

        - The queue is durable.

      1. Quit the command with CTRL+C and wait a couple of seconds.
      2. Note that the messages on the queue is increasing in the management console.
      3. Run the command again to connect the receiver.
      4. Note that NO pending messages are received. Note that the queue id in the management console did change. Note that the queue in the management console now has 0 pending messages.

       

      Conclusion: For 2 independent durable subscriptions adding the multicast: prefix will remove the existing durable subscription and replace it with a new one while not adding the multicast: prefix will only the receiver to reuse the existing durable subscription.

       

      Minimal broker.xml:

       

       Minimal broker.xml:
      <?xml version='1.0'?>
      
      <configuration xmlns="urn:activemq"
                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                     xmlns:xi="http://www.w3.org/2001/XInclude"
                     xsi:schemaLocation="urn:activemq /schema/artemis-configuration.xsd">
      
         <core xmlns="urn:activemq:core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="urn:activemq:core ">
      
            <name>ARTEMIS</name>
      
            <acceptors>
               <acceptor name="amqp">tcp://0.0.0.0:5672?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=AMQP;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpMinLargeMessageSize=102400;amqpDuplicateDetection=true;anycastPrefix=anycast:;multicastPrefix=multicast:;sslEnabled=false</acceptor>
            </acceptors>
      
            <security-settings>
                <security-setting match="foobar">
                  <!-- * = own (sender+receiver) appname -->
                  <permission type="createNonDurableQueue" roles="amq"/>
                  <permission type="deleteNonDurableQueue" roles="amq"/>
                  <permission type="createDurableQueue" roles="amq"/>
                  <permission type="deleteDurableQueue" roles="amq"/>
                  <permission type="createAddress" roles="amq"/>
                  <permission type="deleteAddress" roles="amq"/>
                  <permission type="browse" roles="amq"/>
                  <permission type="consume" roles="amq"/>
                  <permission type="send" roles="amq"/>
               </security-setting>
            </security-settings>
      
      
            <address-settings>
               <address-setting match="foobar">
                  <!-- * = sender appname -->
                  <max-size-bytes>100000000</max-size-bytes>
                  <page-size-bytes>10000000</page-size-bytes>
                  <address-full-policy>BLOCK</address-full-policy>
                  <auto-create-queues>true</auto-create-queues>
                  <auto-create-addresses>true</auto-create-addresses>
                  <auto-create-jms-queues>false</auto-create-jms-queues>
                  <auto-create-jms-topics>true</auto-create-jms-topics>
                  <min-expiry-delay>60000</min-expiry-delay>
                  <max-expiry-delay>604800000</max-expiry-delay>
                  <default-queue-routing-type>MULTICAST</default-queue-routing-type>
                  <default-address-routing-type>MULTICAST</default-address-routing-type>
               </address-setting>
            </address-settings>
      
            <addresses>
      
               <address name="foobar">
                  <multicast>
                  </multicast>
               </address>
            </addresses>
         </core>
      </configuration>
      
      

       

       

      Attachments

        Issue Links

          Activity

            People

              tabish Timothy A. Bish
              Sebastiaan NS-SlaFleur
              Votes:
              0 Vote for this issue
              Watchers:
              5 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Time Tracking

                  Estimated:
                  Original Estimate - Not Specified
                  Not Specified
                  Remaining:
                  Remaining Estimate - 0h
                  0h
                  Logged:
                  Time Spent - 20m
                  20m