在ActiveMQ Artemis broker.xml中为每个队列(而不是每个地址)配置不同的设置



我们操作一个ActiveMQ Artemis消息代理,将传入的测量(例如气象站)分发到下游系统。通常有多个消费者。因此,例如给定地址measurements.africa,将有多播队列consumer1.africaconsumer2.africa附加。

现在一些下游系统是不可靠的,他们有时不能参加他们的队列。这需要我们进行人工干预,以防止消息代理被填满。由于这些不可靠的系统应该尽最大努力获取消息,所以我希望在这些队列开始填满时自动剔除消息。同时,还有其他队列应该可靠地保存消息,直到下游系统再次可用。

所以我想给不可靠的队列一个共同的前缀,说unreliable.,然后在broker.xml配置这些队列来丢弃消息:

<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>

然而,我发现我只能配置地址本身的设置,而不能配置该地址上的队列。因此,队列reliable.consumer1.africaunreliable.consumer2.africa不能在broker.xml中配置不同的设置。队列由Apache Camel JMS组件使用subscriptionName=参数自动创建。

我已经通读了Artemis关于地址设置的手册,但它没有提到一种方法。是否有一种方法可以在同一地址上创建具有不同设置的队列?

无法将地址设置应用于特定队列。在几乎所有情况下,如果一个设置对一个队列是可行的,那么它对绑定到该地址的所有队列都是可行的。

然而,在您确实需要不同地址设置的情况下,您可以使用非排他性分流和另一个地址来拆分消息流,例如:

<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>

通过此配置,发送到measurements.africa的任何消息都将同时发送到unreliable.measurements.africa,这意味着不可靠的消费者可以订阅unreliable.measurements.africa,而可靠的消费者可以继续使用measurements.africa。然后你可以像这样应用你的地址设置:

<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>

最新更新