【发布时间】:2015-02-20 16:05:11
【问题描述】:
有没有办法限制 ActiveMQ 中的队列大小。就像我有四个队列:Q1、Q2、Q3、Q4 并且我想要当 Q3 有 200 MB 的消息时它应该阻塞直到消息没有被消耗,但其他 Q1、Q2、Q4 正常运行。
【问题讨论】:
有没有办法限制 ActiveMQ 中的队列大小。就像我有四个队列:Q1、Q2、Q3、Q4 并且我想要当 Q3 有 200 MB 的消息时它应该阻塞直到消息没有被消耗,但其他 Q1、Q2、Q4 正常运行。
【问题讨论】:
你可以做到,但你必须分步进行。
有不同类型的内存,例如普通内存“RAM”或持久存储中的磁盘空间。您必须单独配置它们。因为当“RAM”内存用完时,消息被换出并从存储中获取(取决于配置)。
但是,您希望有一个系统范围的限制,如下所示:
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage percentOfJvmHeap="70" />
</memoryUsage>
<storeUsage>
<storeUsage limit="100 gb"/>
</storeUsage>
<tempUsage>
<tempUsage limit="50 gb"/>
</tempUsage>
</systemUsage>
</systemUsage>
以这些条目为起点,您可以应用限制某些队列的per-destination-policies。这是设置为系统内存的百分比,所以你需要做一些计算。
根据您想要的效果使用storeUsageHighWaterMark 和/或cursorMemoryHighWaterMark。请注意,存储不用于非持久消息。
对于基本内存限制,您还可以在目标策略上使用memoryLimit 设置。它是memoryUsage 系统属性的子对象。
【讨论】:
<policyEntry queue="ORDERS.>"> 这样的策略,以使其覆盖以 ORDERS 等开头的所有队列。然后为此队列(或队列集)应用内存限制.
<policyEntry queue="ANOTHER.>" producerFlowControl="true" memoryLimit="12 kb">
不将队列大小限制为 12 kb
【讨论】: