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