sba
sba

Reputation: 2107

Configure different settings per queue, not per address, in ActiveMQ Artemis broker.xml

We operate an ActiveMQ Artemis message broker to distribute incoming measurements (think weather stations) to downstream systems. There often are multiple consumers. So for example given the address measurements.africa, there would be multicast queues consumer1.africa and consumer2.africa attached.

Now some downstream systems are not reliable, they sometimes fail to attend to their queues. This requires manual intervention on our part to prevent the message broker from filling up. Since these unreliable systems should get messages on a best effort basis, I'd like to automate the culling of messages, when those queues start to fill up. At the same time, there are other queues that should reliably keep messages until downstream systems are available again.

So I'd thought to give the unreliable queues a common prefix, say unreliable. and then in broker.xml configure those queues to drop messages:

<address-setting match="reliable.#">
   <expiry-delay>-1</expiry-delay>
</address-setting>

<address-setting match="unreliable.#">
   <expiry-delay>300000</expiry-delay>
   <expiry-address></expiry-address>
</address-setting>

However, I found that I can only configure settings on the address itself, not on the queues on this address. So the queues reliable.consumer1.africa and unreliable.consumer2.africa cannot have different settings configured in broker.xml. The queues are created automatically by the Apache Camel JMS component, using the subscriptionName= parameter.

I've read through the Artemis manual on address settings, but it doesn't mention a way. Is there a way to create queues with different settings on the same address?

Upvotes: 1

Views: 647

Answers (1)

Justin Bertram
Justin Bertram

Reputation: 35008

There is no way to apply address settings to a specific queue. In almost all circumstances if one setting is viable for one queue then it is viable for all the queues bound to that address.

However, in circumstances where you really need different address settings then you can split the message flow using a non-exclusive divert and another address, e.g.:

<diverts>
   <divert name="measurements.africa-divert">
      <address>measurements.africa</address>
      <forwarding-address>unreliable.measurements.africa</forwarding-address>
      <exclusive>false</exclusive>
   </divert>
</diverts>
<addresses>
   ...
   <address name="measurements.africa">
      <multicast/>
   </address>
   <address name="unreliable.measurements.africa">
      <multicast/>
   </address>
</addresses>

With this configuration any message sent to measurements.africa will also be sent to unreliable.measurements.africa which means that unreliable consumers can subscribe to unreliable.measurements.africa and reliable consumers can continue to use measurements.africa. Then you can apply your address settings like so:

<address-setting match="measurements.africa">
   <expiry-delay>-1</expiry-delay>
</address-setting>

<address-setting match="unreliable.#">
   <expiry-delay>300000</expiry-delay>
   <expiry-address></expiry-address>
</address-setting>

Upvotes: 2

Related Questions