【发布时间】:2014-08-08 20:02:13
【问题描述】:
我们正在使用具有以下配置的 ActiveMQ 5.6: - 流量控制开启 - 主题的内存限制 1MB - 启用镜像队列(未定义明确的虚拟主题)
有持久消息被发送到队列QueueA。显然,这条消息被复制到Mirror.QueueA,这是一个非持久性的自动创建的主题。
在这个话题上,没有消费者。如果偶尔有消费者,他们就是非持久订阅者。
一段时间后,生产者阻塞,我们得到以下错误:
Usage Manager memory limit reached for topic://Mirror.QueueA
根据various sources 包括ActiveMQ documentation,没有持久订阅者的主题中的消息将被丢弃,这是我想要的和预期的。但显然情况并非如此。
有one related StackOverflow question,但公认的解决方案建议使用流量控制但禁用磁盘假脱机:
当达到 memoryLimit 时,不会使用磁盘和块生产者。
但我不想阻止生产者,因为他们会无限期地阻止,因为没有消费者来。为什么要保留这些消息?
我看到几个选项: - 这是一个错误,可能会在以后的 AMQ 版本中修复 - 这是一些配置问题(我不知道如何解决) - 有一些选项可以在达到内存限制时简单地删除最旧的消息(我找不到任何这样的选项)
希望有人能帮忙!
谢谢,
//J
[更新]
虽然我们已经在现场部署了 5.6 版本,但我目前正在以相同配置在 5.8 安装的 AMQ 上运行相同的耐久性/负载测试。现在,我已经传送了 10 倍于 5.6 系统的消息,没有任何问题。我会让这个测试在晚上甚至接下来的几天里运行,看看是否还有其他限制。
【问题讨论】:
标签: memory persistence activemq jms-topic flooding