我使用ActiveMQ 5.4和KahaDB作为消息存储.在将消息(具有持久性为真)发布到具有持久订阅者的主题时,即使将消息分派给订阅者,持久性存储也在增加.因此,这会导致问题,因为消息存储已满,并且不再接受任何消息.
所以我的问题是为什么持久性存储不会丢弃KahaDB中的消息,即使消息正在被调度?
问候,
SRINIVAS
Jak*_*rab 10
您所看到的是ActiveMQ消息存储行为与主题上的持久订阅之间的交互.
如果您有持久订阅,则会将主题视为每个订阅者的clientId(在其上设置Connection)的队列.逻辑是客户端在断开连接时不想错过任何消息.因此,如果它们断开连接,则持久订阅会挂起并使消息保持活动状态.
AMQ消息存储库使用其消息日志的数据日志.这些是按顺序写入的,从未实际删除(需要随机访问).还有第二个文件可以跟踪已消耗的消息.一旦消耗了数据文件中的所有消息,就删除该文件.
所以你看到的是数据文件中的一些消息没有被这些持久订阅所消耗,只是闲逛.持久订阅的持久订阅者的ClientIds会导致此问题.如果您使用JMX检查代理上的订阅,这可能会帮助您找到根本原因,那么使用该功能的方式可能有问题.
作为一般规则,只要您认为可能需要使用持久订阅,请使用虚拟主题 - 它们更容易推理,检查和负载平衡.另一方面,如果您只是想在重新连接主题订阅者时收到最后几条消息而不是您可能错过的所有消息,请使用追溯消费者.
解决这个问题的一个简单方法是在发送消息时始终使用生存时间 - 几乎每个用例都有一个时间限制,无论如何都应该消息消息.ActiveMQ将使超出此时间的消息到期,并释放数据文件中的消息以进行删除.