ActiveMQ in Action-5.5 The memory message store- 高飞网

5.5 The memory message store

2016-05-26 17:32:05.0

5.5 内存消息存储

    内存消息存储把所有的持久消息都保存到内存当中。

    不涉及主动缓存(No active caching is involved),所以你必须要留意JVM和ActiveMQ服务端的内存设置,使之足以同时容纳所有存在的消息。

    如果能确定服务端将只存储有限数量的消息,而且通常能很快被消费掉,那么用内存存储就很好。真正使用它一般是一些小的测试用例,这种场景下,你可能想要验证与服务端的互通,但在开始时又不想增加消息的存储成本,或者想在测试完成之后更易容地清理掉消息。

5.5.1 配置内存存储

    配置内存存储很简单。内存存储是通过把broker节点中persistent属性设置为false实现的(默认为true)。下面是一个使用ActiveMQ消息存储的示例配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <broker brokerName="test-broker" persistent="false"
        xmlns="http://activemq.apache.org/schema/core">
        <transportConnectors>
            <transportConnector uri="tcp://localhost:61635" />
        </transportConnectors>
    </broker>
</beans>

    通过设置broker节点上的persistent属性为false,实际上告诉服务端不要持久化消息为永久存储。取而代之的是,ActiveMQ服务端将所有的消息都保存在内存中,直到消息被消费或者服务端关闭。

    用内存存储嵌入到ActiveMQ服务端是很容易的。下面的配置示例启动一个使用内存存储的服务端。

import org.apache.activemq.broker.BrokerService;

public void createEmbeddedBroker() throws Exception {
    BrokerService broker = new BrokerService();
    // configure the broker to use the Memory Store
    broker.setPersistent(false);
    // Add a transport connector
    broker.addConnector("tcp://localhost:61616");
    // now start the broker
    broker.start();
}

    注意黑色字体部分,设置broker对象的persistence属性为false。这与上面xml配置示例是等价的。

    当前还没有工具能把一种类型的消息存储更改为另一种。如果你想为一个应用改变消息存储,建议你在一个新的ActiveMQ服务端做这件事,或者等到你的应用已经消费完所有已发送的消息,然后关闭ActiveMQ服务端,重新配置新的消息存储,并将其重启。

    到这里已经探讨了ActiveMQ消息持久化的多种消息存储实现。另外一个关于消息持久化讨论的话题是一个更专业的场景——ActiveMQ服务端为未持久topic请阅者缓存消息。