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

标签 java activemq messaging

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

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

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

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

最佳答案

当代理内存不足时,生产者将被阻塞,直到清除一些内存为止。这是在定期使用消息的假设下进行的。

真正应该担心的是队列内存不足的原因。

您生成消息的速度是否比使用消息的速度快?如果是这样,故障转移不会真正帮助您,因为下一个代理将很快耗尽内存。 ActiveMQ 支持生产者流量控制,以确保生产者不会压垮代理。 (see here)

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

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

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

关于java - ActiveMQ:如果内存/数据存储已满,则进行故障转移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19663812/

相关文章:

windows-phone - 在 'Messaging' 中创建消息

Java javax.swing.Timer - 卡住我的 GUI。解决方案?

java - 如何在 editText 中添加数字

java - 方法签名声明为 throws Exception;实现为抛出 Exception 的子类

jms - ActiveMQ 重新交付策略 - 它是如何工作的?

java - 在代理的activemq网络中禁用jmx(spring,xbean)

java - JMS 消息队列可以在这种情况下用于我的用例吗?

java - 在具有多个允许签名的 Android 服务上实现签名级安全性

azure - 如何停止将过多的 ServiceBusReceiver.Receive 依赖项日志记录到 App Insights

jms - 何时将持久性与 Java 消息传递和队列系统结合使用