【发布时间】:2012-01-09 05:18:15
【问题描述】:
我使用 ActiveMQ 5.4 和 KahaDB 作为消息存储。 在将消息(持久性为真)发布到具有持久订阅者的主题时,即使消息被分派到订阅者,持久性存储也在增加。因此,由于消息存储已满并且不再接受任何消息,因此这会导致问题。
所以我的问题是,为什么 Persistence 存储没有丢弃 KahaDB 中的消息,甚至消息都被分派了?
问候,
斯里尼瓦
【问题讨论】:
标签: activemq
我使用 ActiveMQ 5.4 和 KahaDB 作为消息存储。 在将消息(持久性为真)发布到具有持久订阅者的主题时,即使消息被分派到订阅者,持久性存储也在增加。因此,由于消息存储已满并且不再接受任何消息,因此这会导致问题。
所以我的问题是,为什么 Persistence 存储没有丢弃 KahaDB 中的消息,甚至消息都被分派了?
问候,
斯里尼瓦
【问题讨论】:
标签: activemq
您看到的是ActiveMQ message store 行为与durable subscriptions on topics 行为之间的交互。
当您拥有持久订阅时,主题被视为每个订阅者的 clientId 的队列(在 Connection 上设置)。逻辑是客户端在断开连接时不想错过任何消息。因此,如果它们断开连接,持久订阅就会挂起并保持消息处于活动状态。
AMQ 消息存储使用数据日志作为其消息日志。这些是按顺序写入的,并且从未真正从中删除(这将需要随机访问)。还有一个文件记录了哪些消息已被消费。一旦数据文件中的所有消息都被消费完,该文件就会被删除。
因此,您所看到的是数据文件中的一些消息没有被这些持久订阅消耗,而只是徘徊。未始终使用的持久订阅者的 ClientId 会导致此问题。如果您使用 JMX 检查代理上的订阅,这可能会帮助您找到根本原因,那么该功能的使用方式可能存在问题。
作为一般规则,每当您认为您可能想要使用持久订阅时,请改用virtual topics - 它们更容易推理、检查和负载平衡。另一方面,如果您只想在重新连接主题订阅者时获得最后几条消息,而不是您可能错过的所有消息,请使用retroactive consumers。
解决此问题的一种简单方法是在发送消息时始终use a time to live - 几乎每个用例都有一个时间限制,即无论如何都应该使用消息。 ActiveMQ 将使超过此时间点的消息过期,并释放数据文件中的消息以供删除。
【讨论】: