如果其中一个代理实例出现故障,ActiveMQ中的故障转移传输可以很好地工作 - 生产者自动切换到下一个代理实例。
如果代理达到内存限制(通过activemq.xml中的systemUsage
属性配置),我期待相同的行为。但是在这种情况下,它只是开始在日志中抛出“内存已满”警告,但生产者应用程序中的jmsTemplate.convertAndSend
方法只是挂起。
我尝试为systemUsage属性设置sendFailIfNoSpace="true"
选项。在这种情况下,生产者应用程序刚刚开始在org.springframework.jms.ResourceAllocationException: Usage Manager Store is Full
上抛出convertAndSend
异常,并且无论如何都没有切换到良好的代理实例。
有人可以建议如何在例外情况下进行故障转移和/或“内存已满”吗?
答案 0 :(得分:1)
当代理内存不足时,生产者将被阻止,直到某些内存被清除。这是假设消息定期消耗。
真正让您担心的是您的队列内存不足的原因。
您是否在消费它们时更快地生成消息?如果是这样,故障转移将无法真正帮助您,因为下一个代理将快速耗尽内存。 ActiveMQ支持生产者流程控制,以确保生产者不会压倒代理。 (see here)
消费消息发生了什么?它们是永久存储的吗?如果是这样,请考虑使用timeToLive以确保为传入消息清除空间。
如果由于某种原因,您需要在队列之后填充队列,则可以在生产者中捕获异常并手动进行故障转移。
另请参阅此类似问题:ActiveMQ: Reject connections from producers when persistent store fills