超过内存限制后,ActiveMQ 开始从队列中删除消息
ActiveMQ Start dropping messages from Queue after memory limit is exceed
在我们的项目中,我需要将消息推送到 ActiveMQ 并保持它们的持久性。当我发送新消息并且超出内存限制时,队列中最旧的消息应该从队列中 dropped/removed 或替换为新消息。
我不想清除整个队列,队列的工作方式类似于我们产品的故障安全消息积压,因此我需要在队列中保留最后 x 条消息。
我已经尝试从 google 开始查看,但到目前为止运气不好。
这是我的政策settings.xml
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" producerFlowControl="false" memoryLimit="5mb" >
<messageEvictionStrategy>
<oldestMessageEvictionStrategy/>
</messageEvictionStrategy>
<pendingMessageLimitStrategy>
<constantPendingMessageLimitStrategy limit="100"/>
</pendingMessageLimitStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
逐出策略对象仅适用于主题,您不能在队列上使用它们,因为队列的服务契约是它存储所有消息,直到它们被使用或它们的生命周期通过设置的 TTL 值到期。代理可以将队列上的消息存储到磁盘,从而将它们从内存中删除,但对于主题,合同更宽松,并且驱逐策略允许删除内存中等待分派给主题消费者的消息。
您只能通过 TTL 值控制队列中消息的生命周期。
除非我们删除或使用它,否则您不能从磁盘中删除持久消息。您可以启用 producerFlowControl 来限制生产者,以便它在从队列中使用旧消息后接受新的管理,或者按照 Tim 建议的那样在消息上设置 TTL。
在我们的项目中,我需要将消息推送到 ActiveMQ 并保持它们的持久性。当我发送新消息并且超出内存限制时,队列中最旧的消息应该从队列中 dropped/removed 或替换为新消息。
我不想清除整个队列,队列的工作方式类似于我们产品的故障安全消息积压,因此我需要在队列中保留最后 x 条消息。
我已经尝试从 google 开始查看,但到目前为止运气不好。
这是我的政策settings.xml
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" producerFlowControl="false" memoryLimit="5mb" >
<messageEvictionStrategy>
<oldestMessageEvictionStrategy/>
</messageEvictionStrategy>
<pendingMessageLimitStrategy>
<constantPendingMessageLimitStrategy limit="100"/>
</pendingMessageLimitStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
逐出策略对象仅适用于主题,您不能在队列上使用它们,因为队列的服务契约是它存储所有消息,直到它们被使用或它们的生命周期通过设置的 TTL 值到期。代理可以将队列上的消息存储到磁盘,从而将它们从内存中删除,但对于主题,合同更宽松,并且驱逐策略允许删除内存中等待分派给主题消费者的消息。
您只能通过 TTL 值控制队列中消息的生命周期。
除非我们删除或使用它,否则您不能从磁盘中删除持久消息。您可以启用 producerFlowControl 来限制生产者,以便它在从队列中使用旧消息后接受新的管理,或者按照 Tim 建议的那样在消息上设置 TTL。