ActiveMQ-如何为某些队列保留存储空间?

ActiveMQ-如何为某些队列保留存储空间?,activemq,Activemq,我使用ActiveMQ作为外部应用程序的消息服务器,但也用于内部消息 如果我的应用程序宕机时间过长,则外部应用程序将充满ActiveMq服务器。但当我重新启动它时,它不能使用消息,因为它不能发送“内部”消息(我的路由是事务性的)。所以整个系统都被封锁了 有没有办法为我的内部邮件预留一些存储空间?或者可以限制某些队列的大小吗 谢谢是的,您可以使用和生产者流控制来限制所有或特定队列消耗的最大内存。在activemq.xml中,您需要添加如下部分: <destinationPolicy>

我使用ActiveMQ作为外部应用程序的消息服务器,但也用于内部消息

如果我的应用程序宕机时间过长,则外部应用程序将充满ActiveMq服务器。但当我重新启动它时,它不能使用消息,因为它不能发送“内部”消息(我的路由是事务性的)。所以整个系统都被封锁了

有没有办法为我的内部邮件预留一些存储空间?或者可以限制某些队列的大小吗

谢谢

是的,您可以使用和生产者流控制来限制所有或特定队列消耗的最大内存。在activemq.xml中,您需要添加如下部分:

<destinationPolicy>
    <policyMap>
        <policyEntries>
            <policyEntry queue=">" producerFlowControl="true" memoryLimit="50mb" />
        </policyEntries>
    </policyMap>
</destinationPolicy>

“>”将匹配所有队列。您可以更改模式以仅匹配您希望策略影响的队列

受策略影响的每个队列都将其内存限制设置为50mb。这意味着您需要考虑队列的数量来计算队列消耗的最大内存,以及它是否适合可用的VM堆空间

该策略仅限制要使用的内存量。只能为代理全局设置,而不能基于每个目的地进行设置。

我尝试对其他答案进行编辑,但未获得批准

您可以使用限制单个队列使用的存储。调整默认为100%的
storeUsageHighWaterMark
属性。从文件中:

系统使用存储限制将导致发送到块的临界点

因此,您的配置类似于:

<destinationPolicy>
  <policyMap>
    <policyEntries>
      <policyEntry queue=">" storeUsageHighWaterMark="75" producerFlowControl="true" >
      </policyEntry>
      <policyEntry queue="INTERNAL.>" storeUsageHighWaterMark="100" producerFlowControl="true">
      </policyEntry>
    </policyEntries>
  </policyMap>
</destinationPolicy>


这表示以
INTERNAL.
开头的队列在阻塞之前可以使用100%的存储空间。一旦75%的存储空间被占用,其他队列将被阻塞

这种平和的配置意味着:“所有队列必须共享50mb”或“每个队列的容量不得超过50mb”?还有另一个问题,我使用的是持久队列,“MemoryLit”不是限制内存中的空间(而不是存储空间)?好的,我想这就是我的问题的答案:如果我想为一些队列保留一些存储空间,我必须创建另一个代理…Dush,你不需要。我已经更新了@Ralf的答案,增加了一些细节