在ActiveMQ中,MessageListener是否依赖于消息存储的数据日志文件

时间:2012-02-27 06:26:08

标签: jms activemq

我在我的应用程序中使用ActiveMQ作为JMS实现服务器。场景就像是,有一个主题,我有许多持久订阅者使用已发布的消息和一个消息监听器,它将数据从消息对象保存到中央数据库服务器。有一个生产者线程,它继续在同一主题上发布持久性消息。我正在使用KahaDB来持久化Message Store。一旦发布消息,kahaDB就会在消息存储库中创建一个数据日志文件以保留消息,直到所有持久订阅者都使用它为止。我想知道在任何时候,我关闭JMS服务器并删除所有数据日志文件,会产生什么影响。是否只有少数持久的子载体不会收到数据日志文件中存在的消息,或者是否有可能在中央数据库中没有保存很少的消息,这是由消息监听器在此主题上完成的。 非常感谢任何提示或帮助...... 提前谢谢。

1 个答案:

答案 0 :(得分:2)

如果停止并启动代理,无论是否删除了数据文件,尚未收到已发布消息的主题消费者将不再接收该消息。这背后的原因是发送到主题的消息不会写入持久消息存储库。

耐用性和持久性不是一回事。持久订阅告诉代理保留订阅状态以防订阅者断开连接 - 消费者断开连接时发送的任何消息都将被保留。另一方面,非持久订阅是有限的;如果订户断开连接,则会错过在此期间发送的任何消息。所有消息都存储在内存中,并且无法在代理重新启动后继续存在。

另一方面,消息持久性存储最终传递的消息。这可以防止灾难性的失败,或者以后交付给可能尚未活跃的消费者。

如果您想使用pub-sub广播消息,并且订阅看起来是持久的并且在代理重新启动后仍然存在,那么您应该使用virtual destinations而不是持久订阅。

在关闭代理并删除数据目录之后,不会发生持久性或非持久性消息。