blob: 293cb42594eefdd6687eb5a78e78502396182eaa [file] [log] [blame]
<div class="wiki-content maincontent"><h2 id="Persistence-ActiveMQV5.9">ActiveMQ V5.9</h2><p>In ActiveMQ 5.9, the <a shape="rect" href="replicated-leveldb-store.html">Replicated LevelDB Store</a> is introduced. It handles using <a shape="rect" class="external-link" href="http://zookeeper.apache.org/">Apache ZooKeeper</a> to pick a master from a set of broker nodes configured to replicate single LevelDB Store. Then synchronizes all slave LevelDB Stores with the master keeps them up to date by replicating all updates to the master. This might become the preferred <a shape="rect" href="masterslave.html">Master Slave</a> configuration going forward.</p><h2 id="Persistence-ActiveMQV5.8">ActiveMQ V5.8</h2><p>In ActiveMQ 5.8, the <a shape="rect" href="leveldb-store.html">LevelDB Store</a> was introduced. The LevelDB Store is a file based persistence database. It has been optimized to provide even faster persistence than KahaDB. Although not yet the default message store, we expect this store implementation become the default in future releases.</p><h2 id="Persistence-ActiveMQV5.3">ActiveMQ V5.3</h2><p>From 5.3 onwards - we recommend you use <a shape="rect" href="kahadb.html">KahaDB</a> - which offers improved scalability and recoverability over the <a shape="rect" href="amq-message-store.html">AMQ Message Store</a>.<br clear="none"> The <a shape="rect" href="amq-message-store.html">AMQ Message Store</a> which although faster than <a shape="rect" href="kahadb.html">KahaDB</a> - does not scales as well as <a shape="rect" href="kahadb.html">KahaDB</a> and recovery times take longer.</p><h2 id="Persistence-ActiveMQV4">ActiveMQ V4</h2><p>For long term persistence we recommend using JDBC coupled with our high performance journal. You can use just JDBC if you wish but its quite slow.</p><p>Our out of the box default configuration uses <a shape="rect" class="external-link" href="http://incubator.apache.org/derby/">Apache Derby</a> as the default database, which is easy to embed - but we support all the <a shape="rect" href="jdbc-support.html">major SQL databases</a> - just reconfigure your JDBC configuration in the <a shape="rect" href="xml-configuration.html">Xml Configuration</a>.</p><h2 id="Persistence-Highperformancejournal-ActiveMQ4.x">High performance journal - ActiveMQ 4.x</h2><p>To achieve high performance of durable messaging in ACtiveMQ V4.x we strongly recommend you use our high performance journal - which is enabled by default. This works rather like a database; messages (and transcation commits/rollbacks and message acknowledgements) are written to the journal as fast as is humanly possible - then at intervals we checkpoint the journal to the long term persistence storage (in this case JDBC).</p><p>Its common when using queues for example that messages are consumed fairly shortly after being published; so you could publish 10,000 messages and only have a few messages outstanding - so when we checkpoint to the JDBC database, we often have only a small amount of messages to actually write to JDBC. Even if we have to write all the messages to the JDBC, we still get performance gains with the journal, since we can use a large transaction batch to insert the messages into the JDBC database to boost performance on the JDBC side.</p><p>Our journal is based on lots of the great work in the <a shape="rect" class="external-link" href="http://howl.objectweb.org/" rel="nofollow">Howl</a> project; we keep close ties to the Howl community. However since ActiveMQ has to handle arbitarily large message sizes, we've had to make our journal handle any size of message and so we don't use the fixed size record model that Howl uses.</p><h2 id="Persistence-Configuringpersistence">Configuring persistence</h2><p>For full explict control over configuration check out the <a shape="rect" href="xml-configuration.html">Xml Configuration</a>. However a quick way to set which persistence adapter to use is to set the following system property to be the class name of the PersistenceAdapter implementation.</p><plain-text-body>activemq.persistenceAdapter
</plain-text-body><p>When running the broker from the command line, we look for the activemq.xml on the classpath unless you specify one to use. e.g.<br clear="none"> <strong>AMQ 4.x</strong></p><plain-text-body>activemq xbean:file:myconfig.xml
</plain-text-body><p><strong>AMQ 3.x</strong></p><plain-text-body>activemq myconfig.xml
</plain-text-body><p>or just<br clear="none"> <strong>AMQ3.x/AMQ4.x</strong></p><plain-text-body>activemq
</plain-text-body><p>Here is a sample XML configuration which shows how to configure the journal and the JDBC persistence.</p><p>AMQ 5.x</p><parameter ac:name="">xml</parameter><plain-text-body>&lt;beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:amq="http://activemq.apache.org/schema/core"
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-2.0.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd"&gt;
&lt;bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/&gt;
&lt;broker useJmx="true" xmlns="http://activemq.apache.org/schema/core"&gt;
&lt;networkConnectors&gt;
&lt;!--
&lt;networkConnector uri="multicast://default?initialReconnectDelay=100" /&gt;
&lt;networkConnector uri="static://(tcp://localhost:61616)" /&gt;
--&gt;
&lt;/networkConnectors&gt;
&lt;persistenceFactory&gt;
&lt;journalPersistenceAdapterFactory journalLogFiles="5" dataDirectory="${basedir}/target" /&gt;
&lt;!-- To use a different dataSource, use the following syntax : --&gt;
&lt;!--
&lt;journalPersistenceAdapterFactory journalLogFiles="5" dataDirectory="${basedir}/activemq-data" dataSource="#mysql-ds"/&gt;
--&gt;
&lt;/persistenceFactory&gt;
&lt;transportConnectors&gt;
&lt;transportConnector uri="tcp://localhost:61636" /&gt;
&lt;/transportConnectors&gt;
&lt;/broker&gt;
&lt;!-- MySql DataSource Sample Setup --&gt;
&lt;!--
&lt;bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"&gt;
&lt;property name="driverClassName" value="com.mysql.jdbc.Driver"/&gt;
&lt;property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/&gt;
&lt;property name="username" value="activemq"/&gt;
&lt;property name="password" value="activemq"/&gt;
&lt;property name="poolPreparedStatements" value="true"/&gt;
&lt;/bean&gt;
--&gt;
&lt;/beans&gt;</plain-text-body><p>For more details see the <a shape="rect" href="initial-configuration.html">Initial Configuration</a> guide.</p><h2 id="Persistence-JDBCPersistencewithoutJournaling">JDBC Persistence without Journaling</h2><p>To enable JDBC persistence of JMS messages without journaling, we need to change the message broker's default persistence configuration from<br clear="none"> <strong>AMQ 4.x</strong></p><plain-text-body>&lt;persistenceAdapter&gt;
&lt;journaledJDBC journalLogFiles="5" dataDirectory="../activemq-data"/&gt;
&lt;/persistenceAdapter&gt;
</plain-text-body><p>to</p><plain-text-body>&lt;persistenceAdapter&gt;
&lt;jdbcPersistenceAdapter dataSource="#my-ds"/&gt;
&lt;/persistenceAdapter&gt;
</plain-text-body><p><strong>For AMQ 3.x</strong></p><plain-text-body>&lt;persistence&gt;
&lt;journalPersistence directory="../var/journal"&gt;
&lt;jdbcPersistence dataSourceRef="derby-ds"/&gt;
&lt;/journalPersistence&gt;
&lt;/persistence&gt;
</plain-text-body><p>to</p><plain-text-body>&lt;persistence&gt;
&lt;jdbcPersistence dataSourceRef="derby-ds"/&gt;
&lt;/persistence&gt;
</plain-text-body><p>Make sure to send durable messages so that it will be persisted in the database server while waiting to be consumed by clients. More information on configuration JDBC persistence at <a shape="rect" href="jdbc-support.html">JDBC Support</a></p><p><parameter ac:name=""><a shape="rect" href="kaha-persistence.html">Kaha Persistence</a></parameter></p><h2 id="Persistence-DisasterRecoveryoptions">Disaster Recovery options</h2><p>For people with high <a shape="rect" href="dr.html">DR</a> requirements we have various options for providing a <a shape="rect" href="replicated-message-store.html">Replicated Message Store</a> to allow full failover in times of major data centre failure.</p><h2 id="Persistence-DisablingPersistence">Disabling Persistence</h2><p>If you don't want persistence at all you can disable it easily via the <a shape="rect" href="xml-configuration.html">Xml Configuration</a>. e.g.</p><plain-text-body>&lt;broker persistent="false"&gt;
&lt;/broker&gt;
</plain-text-body><p>This will make the broker use the <a shape="rect" class="external-link" href="http://activemq.apache.org/maven/apidocs/org/apache/activemq/store/memory/MemoryPersistenceAdapter.html">&lt;memoryPersistenceAdapter&gt;</a><br clear="none"> For an example of using a configuration URI see <a shape="rect" href="how-to-unit-test-jms-code.html">How To Unit Test JMS Code</a></p></div>