我们操作一个ActiveMQ Artemis消息代理,将传入的测量(例如气象站)分发到下游系统。通常有多个消费者。因此,例如给定地址measurements.africa
,将有多播队列consumer1.africa
和consumer2.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.africa
和unreliable.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>