ActiveMQ KahaDB持久性存储已满

时间:2011-11-29 21:32:11

标签: activemq

我使用ActiveMQ 5.4和KahaDB作为消息存储。  在将消息(具有持久性为真)发布到具有持久订阅者的主题时,即使将消息分派给订阅者,持久性存储也在增加。因此,这会导致问题,因为消息存储已满,并且不再接受任何消息。

所以我的问题是为什么持久性存储不会丢弃KahaDB中的消息,甚至消息也会被调度?

此致

SRINIVAS

1 个答案:

答案 0 :(得分:10)

您所看到的是ActiveMQ message store行为与durable subscriptions on topics行为之间的互动。

如果您有持久订阅,则会将主题视为每个订阅者的clientId的队列(在Connection上设置)。逻辑是客户端在断开连接时不想错过任何消息。因此,如果它们断开连接,则持久订阅会挂起并使消息保持活动状态。

AMQ消息存储库使用其消息日志的数据日志。这些是按顺序写入的,从未实际删除(需要随机访问)。还有第二个文件可以跟踪已消耗的消息。消费完数据文件中的所有消息后,该文件将被删除。

所以你看到的是数据文件中的一些消息没有被这些持久订阅所消耗,只是闲逛。持久订阅的持久订阅者的ClientIds会导致此问题。如果您使用JMX检查代理上的订阅,这可能会帮助您找到根本原因,那么使用该功能的方式可能有问题。

作为一般规则,每当您认为您可能想要使用持久订阅时,请使用virtual topics - 它们更容易推理,检查和负载平衡。另一方面,如果您只想在重新连接主题订阅者时收到最后几条消息而不是所有可能错过的消息,请使用retroactive consumers

解决此问题的一种简单方法是在发送邮件时始终use a time to live - 几乎每个用例都有一个时间限制,无论如何都应该消息消息。 ActiveMQ将使超出此时间的消息到期,并释放数据文件中的消息以进行删除。