ActiveMQ:如果内存/数据存储已满,则进行故障转移

时间:2013-10-29 16:21:21

标签: java activemq messaging

如果其中一个代理实例出现故障,ActiveMQ中的故障转移传输可以很好地工作 - 生产者自动切换到下一个代理实例。

如果代理达到内存限制(通过activemq.xml中的systemUsage属性配置),我期待相同的行为。但是在这种情况下,它只是开始在日志中抛出“内存已满”警告,但生产者应用程序中的jmsTemplate.convertAndSend方法只是挂起。

我尝试为systemUsage属性设置sendFailIfNoSpace="true"选项。在这种情况下,生产者应用程序刚刚开始在org.springframework.jms.ResourceAllocationException: Usage Manager Store is Full上抛出convertAndSend异常,并且无论如何都没有切换到良好的代理实例。

有人可以建议如何在例外情况下进行故障转移和/或“内存已满”吗?

1 个答案:

答案 0 :(得分:1)

当代理内存不足时,生产者将被阻止,直到某些内存被清除。这是假设消息定期消耗。

真正让您担心的是您的队列内存不足的原因。

您是否在消费它们时更快地生成消息?如果是这样,故障转移将无法真正帮助您,因为下一个代理将快速耗尽内存。 ActiveMQ支持生产者流程控制,以确保生产者不会压倒代理。 (see here

消费消息发生了什么?它们是永久存储的吗?如果是这样,请考虑使用timeToLive以确保为传入消息清除空间。

如果由于某种原因,您需要在队列之后填充队列,则可以在生产者中捕获异常并手动进行故障转移。

另请参阅此类似问题:ActiveMQ: Reject connections from producers when persistent store fills