2

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

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

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

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

4

1 回答 1

3

当代理用完内存时,生产者会被阻塞,直到一些内存被清除。这是在定期消费消息的假设下进行的。

你真正应该担心的是为什么你的队列内存不足。

你产生消息的速度是否比你消费它们的速度更快?如果是这样,故障转移不会真正帮助您,因为下一个代理将很快耗尽内存。ActiveMQ 支持生产者流控制,以确保生产者不会压倒代理。(见这里

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

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

另请参阅这个类似的问题:ActiveMQ: Reject connections from producer when persistent store fills

于 2013-10-29T17:49:43.110 回答