ActiveMQ的另外一個問題就是隻要是軟件就有可能掛掉,掛掉不可怕,怕的是掛掉以後把信息給丟了,因此本節分析一下幾種持久化方式:php
ActiveMQ默認就支持這種方式,只要在發消息時設置消息爲持久化就能夠了。html
打開安裝目錄下的配置文件:java
D:\ActiveMQ\apache-activemq\conf\activemq.xml在越80行會發現默認的配置項:mysql
<persistenceAdapter>web
<kahaDB directory="${activemq.data}/kahadb"/>spring
</persistenceAdapter>sql
注意這裏使用的是kahaDB,是一個基於文件支持事務的消息存儲器,是一個可靠,高性能,可擴展的消息存儲器。數據庫
他的設計初衷就是使用簡單並儘量的快。KahaDB的索引使用一個transaction log,而且全部的destination只使用一個index,有人測試代表:若是用於生產環境,支持1萬個active connection,每一個connection有一個獨立的queue。該表現已經足矣應付大部分的需求。apache
而後再發送消息的時候改變第二個參數爲:tcp
MsgDeliveryMode.Persistent
Message保存方式有2種
PERSISTENT:保存到磁盤,consumer消費以後,message被刪除。
NON_PERSISTENT:保存到內存,消費以後message被清除。
注意:堆積的消息太多可能致使內存溢出。
而後打開生產者端發送一個消息:
不啓動消費者端,同時在管理界面查看:
發現有一個消息正在等待,這時若是沒有持久化,ActiveMQ宕機後重啓這個消息就是丟失,而咱們如今修改成文件持久化,重啓ActiveMQ後消費者仍然可以收到這個消息。
咱們從支持Mysql爲例,先從http://dev.mysql.com/downloads/connector/j/下載mysql-connector-java-5.1.34-bin.jar包放到:
D:\ActiveMQ\apache-activemq\lib目錄下。
打開並修改配置文件:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd"> <!-- Allows us to use system properties as variables in this configuration file --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <value>file:${activemq.conf}/credentials.properties</value> </property> </bean> <!-- Allows accessing the server log --> <bean id="logQuery" class="org.fusesource.insight.log.log4j.Log4jLogQuery" lazy-init="false" scope="singleton" init-method="start" destroy-method="stop"> </bean> <!-- The <broker> element is used to configure the ActiveMQ broker. --> <broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}"> <destinationPolicy> <policyMap> <policyEntries> <policyEntry topic=">" > <!-- The constantPendingMessageLimitStrategy is used to prevent slow topic consumers to block producers and affect other consumers by limiting the number of messages that are retained For more information, see: http://activemq.apache.org/slow-consumer-handling.html --> <pendingMessageLimitStrategy> <constantPendingMessageLimitStrategy limit="1000"/> </pendingMessageLimitStrategy> </policyEntry> </policyEntries> </policyMap> </destinationPolicy> <!-- The managementContext is used to configure how ActiveMQ is exposed in JMX. By default, ActiveMQ uses the MBean server that is started by the JVM. For more information, see: http://activemq.apache.org/jmx.html --> <managementContext> <managementContext createConnector="false"/> </managementContext> <!-- Configure message persistence for the broker. The default persistence mechanism is the KahaDB store (identified by the kahaDB tag). For more information, see: http://activemq.apache.org/persistence.html <kahaDB directory="${activemq.data}/kahadb"/> --> <persistenceAdapter> <jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" dataSource="#derby-ds"/> </persistenceAdapter> <!-- The systemUsage controls the maximum amount of space the broker will use before disabling caching and/or slowing down producers. For more information, see: http://activemq.apache.org/producer-flow-control.html --> <systemUsage> <systemUsage> <memoryUsage> <memoryUsage percentOfJvmHeap="70" /> </memoryUsage> <storeUsage> <storeUsage limit="100 gb"/> </storeUsage> <tempUsage> <tempUsage limit="50 gb"/> </tempUsage> </systemUsage> </systemUsage> <!-- The transport connectors expose ActiveMQ over a given protocol to clients and other brokers. For more information, see: http://activemq.apache.org/configuring-transports.html --> <transportConnectors> <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB --> <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> </transportConnectors> <!-- destroy the spring context on shutdown to stop jetty --> <shutdownHooks> <bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" /> </shutdownHooks> </broker> <bean id="derby-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/> <property name="username" value="root"/> <property name="password" value=""/> <property name="maxActive" value="200"/> <property name="poolPreparedStatements" value="true"/> </bean> <!-- Enable web consoles, REST and Ajax APIs and demos The web consoles requires by default login, you can disable this in the jetty.xml file Take a look at ${ACTIVEMQ_HOME}/conf/jetty.xml for more details --> <import resource="jetty.xml"/> </beans> <!-- END SNIPPET: example -->
重啓ActiveMQ打開phpmyadmin發現多了3張表:
而後啓動生產者(不啓動消費者)
在Mysql中能夠找到這條消息:
關掉ActiveMQ並重啓,模擬宕機。
而後啓動消費者:
而後發現Mysql中已經沒有這條消息了。