我使用 ActiveMQ 作为外部应用程序的消息服务器,但也用于我的内部消息。
如果我的应用程序停机时间太长,外部应用程序完整的ActiveMq服务器。但是,当我重新启动它时,它无法使用消息,因为它无法发送内部消息。消息(我的路由是事务性的)。所以系统都被阻止了。
有没有办法为我的内部消息预留一些商店空间?或者是否可以限制某些队列的大小?
由于
答案 0 :(得分:2)
是的,您可以使用destination policy和生产者流控制来限制所有或特定队列消耗的最大内存。在activemq.xml中,您需要添加如下部分:
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" producerFlowControl="true" memoryLimit="50mb" />
</policyEntries>
</policyMap>
</destinationPolicy>
destination wildcard&#34;&gt;&#34;将匹配所有队列。您可以更改模式以仅匹配您希望策略影响的队列。
受策略影响的每个队列都将其内存限制设置为50mb。这意味着您需要考虑队列数量来计算队列消耗的最大内存以及它是否适合可用的VM堆空间。
该策略仅限制要使用的内存量。 temp- and file-store limits只能为代理全局设置,而不能按目标设置。
答案 1 :(得分:1)
我尝试将此作为对其他答案的修改,但未获批准
您可以使用per destination policies限制单个队列使用的存储空间。调整storeUsageHighWaterMark
属性,默认为100%。来自文档:
the tipping point at which a system usage store limit will cause a sent to block
所以你的配置会是这样的:
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" storeUsageHighWaterMark="75" producerFlowControl="true" >
</policyEntry>
<policyEntry queue="INTERNAL.>" storeUsageHighWaterMark="100" producerFlowControl="true">
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
这表示以INTERNAL.
开头的队列在阻止之前可以使用100%的存储空间。一旦75%的存储空间正在使用,其他队列将阻塞。