[ https://issues.apache.org/jira/browse/ARTEMIS-3357?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17376482#comment-17376482 ]
Robbie Gemmell commented on ARTEMIS-3357: ----------------------------------------- One thing you can do is add a "queue" or "topic" capability to a consumer links 'source' terminus. The broker looks for these, its what e.g the Qpid JMS client does to provide a hint to brokers that might want to auto create things. E.g see example of that at: https://github.com/amqphub/equipage/tree/main/qpid-proton-python/auto-create > Setting multicast: prefix explicitely when reconnecting a durable AMQP client > causes the queue to be renewed and all pending messages lost > ------------------------------------------------------------------------------------------------------------------------------------------ > > Key: ARTEMIS-3357 > URL: https://issues.apache.org/jira/browse/ARTEMIS-3357 > Project: ActiveMQ Artemis > Issue Type: Bug > Components: AMQP > Affects Versions: 2.17.0 > Reporter: NS-SlaFleur > Priority: Critical > > Hello! > > This issue was created after a discussion on the > [us...@activemq.apache.org|mailto:us...@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: > # Configure the 'someUser' user with the amq role and password 'somePassword' > # Start Artemis 2.17.0 with the broker.xml from the link. > # Change directory to the Artemis binary. > # 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: > # Close terminals > # Close management console. > # Quit Artemis. > # Remove persistent files e.g. docker container & volume. > > Test ALL: > # 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. > # Quit the command with CTRL+C and wait a couple of seconds. > # Note that the messages on the queue is increasing in the management > console. > # Run the command again to connect the receiver. > # 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: > # 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. > # Quit the command with CTRL+C and wait a couple of seconds. > # Note that the messages on the queue is increasing in the management > console. > # Run the command again to connect the receiver. > # 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: > > {code: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> > {code} > > -- This message was sent by Atlassian Jira (v8.3.4#803005)