持久性和非持久性交付之间的差异

时间:2017-04-17 21:19:51

标签: jms activemq

我阅读了以下ActiveMQ FAQ,我的理解是假设我在ActiveMQ服务器关闭时向ActiveMQ服务器发送消息,但是如果我将生产者的交付模式标记为持久producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);然后,一旦ActiveMQ服务器启动,就会传递消息。

现在,为了测试这个,我只是停止了我的ActiveMQ服务器,然后从JMS生产者发送了一条消息,现在正如预期的那样我得到连接拒绝错误(请注意我没有关闭我的JMS生产者连接/ borker)但是我当我启动我的ActiveMQ服务器时,我没有收到该消息。

我是否误解了常见问题解答,如果是,那是什么意思?

1 个答案:

答案 0 :(得分:3)

当您发送持久消息时,代理会将该消息存储在磁盘上的存储中,以便稍后恢复,如果代理关闭或关闭并稍后重新启动。当消息作为非持久性发送时,它仅存储在内存中,并且如果代理因某种原因而停止这些消息丢失,则永远不会再次收到消息。

当经纪人关闭并且您尝试发送给它时,那么正如您可能想象的那样,经纪人无法存储持续发送的消息,因为它已经......了。

如果客户端使用故障转移传输,则发送应阻止等待重新连接发生在同一代理或您已配置的备用代理,然后将消息发送到该代理。如果不使用故障转移传输,则客户端会获取错误,并且您需要在以后重新发送。

设置持久性作为发送模式不会超越时间和空间,以使消息在发生故障之前到达代理。