ActiveMQ在超出内存限制后开始从队列中删除消息

时间:2017-05-08 16:30:31

标签: stack activemq fifo

在我们的项目中,我需要将消息推送到ActiveMQ并保持它们的持久性。当我发送新消息并且内存限制超过时,队列中的最旧消息应该从队列中删除/删除或替换为新消息。

我不想清除整个队列,队列就像我们产品的故障安全消息积压一样,所以我需要在队列中保留最后x个消息量。

我试图从谷歌看,到目前为止没有运气。

这是我的策略settings.xml

    <destinationPolicy>
        <policyMap>
          <policyEntries>
              <policyEntry queue=">" producerFlowControl="false" memoryLimit="5mb"  > 

                   <messageEvictionStrategy>
                    <oldestMessageEvictionStrategy/>
                   </messageEvictionStrategy>

            <pendingMessageLimitStrategy>
                <constantPendingMessageLimitStrategy limit="100"/>
            </pendingMessageLimitStrategy>

                 </policyEntry>
          </policyEntries>
        </policyMap>
    </destinationPolicy>

2 个答案:

答案 0 :(得分:1)

驱逐策略对象仅适用于主题,您不能在队列中使用它们,因为队列的服务合同是它存储所有消息,直到它们被消耗或其生命周期通过设置的TTL值到期。代理可以将队列中的消息存储到磁盘,从而将其从内存中删除,但是对于主题,合同更宽松,并且逐出策略允许等待分派给主题消费者的内存中的消息被丢弃。

您只能通过TTL值控制队列中邮件的生命周期。

答案 1 :(得分:0)

除非我们删除或使用它,否则您无法从磁盘中删除持久性消息。您可以启用producerFlowControl来限制生产者,以便在从队列中消耗旧消息后接收新的menage,或者Tim建议在消息上设置TTL。