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