Hello,
    it looks like the broker is not deleting auto-created-addresses that are 
not bound to a queue.
I’m using Artemis 2.18.
Wildcards are set as MQTT protocol specifications:


    <wildcard-addresses>

       <routing-enabled>true</routing-enabled>

       <delimiter>/</delimiter>

       <any-words>#</any-words>

      <single-word>+</single-word>

   </wildcard-addresses>

The address configuration is (ttl is quite low for testing purpose):


   <auto-create-queues>true</auto-create-queues>

    <auto-create-addresses>true</auto-create-addresses>

    <auto-create-jms-queues>true</auto-create-jms-queues>

    <auto-create-jms-topics>true</auto-create-jms-topics>

   <auto-delete-queues>true</auto-delete-queues>

   <auto-delete-created-queues>true</auto-delete-created-queues>

    <auto-delete-queues-delay>15000</auto-delete-queues-delay>

    <auto-delete-queues-message-count>0</auto-delete-queues-message-count>

    <auto-delete-addresses>true</auto-delete-addresses>

    <auto-delete-addresses-delay>15000</auto-delete-addresses-delay>

I used for my tests MQTT clients and, for example, if there is a subscription 
like topic1/# and a client publishes to topic1/topic2/topic3 the address and 
the queue topic1 are deleted after client unsubscribe and disconnect but not 
the topic1/topic2/topic3 address.

To fix this problem I tried to delete “manually” the addresses (using a 
specific plugin, see the code below), but under load (several messages per 
second/different topics/connected clients) it looks like there is some message 
lost.
Indeed, MQTT clients published messages count is higher than the messages 
received count (I have a ServerPlugin that intercepts the beforeSend method to 
count the received messages)


    private void cleanAddress(ActiveMQServer server) {

        long currentTime = System.currentTimeMillis();

        server.getPostOffice().getAddresses().forEach(address -> {

            AddressInfo addressInfo = server.getAddressInfo(address);

            String addressStr = addressInfo.getName().toString();

            logger.debug("Evaluating address: {}", addressInfo.getName());

            try {

                if 
(addressInfo.getUnRoutedMessageCount()<=unroutedMessagesToDeleteAddress &&

                        !server.getPostOffice().isAddressBound(address) &&

                        isExpired(addressStr, currentTime)) {

                    server.removeAddressInfo(address, null);

                    logger.debug("Deleted address: {}", addressStr);

                }

            } catch (Exception e) {

                logger.warn("Error deleting address {}", addressStr, e);

            }

        });

        //is needed??????

        server.clearAddressCache();

    }



    private boolean isExpired(String address, long currentTime) {

        ...

    }

Can someone suggest me the right way to delete addresses (is there a way to 
lock the address table or synchronize the deletion process) to avoid losing 
messages?

Thank you in advance for your feedback!

Riccardo


Reply via email to