2.3 Persistence
2.3.1 AMQ Message Store
AMQ Message
Store是ActiveMQ5.0
缺省的持久化存储。Message commands被保存到transactional
journal(由rolling data logs组成)。Messages被保存到data logs中,同时被reference
store进行索引以提高存取速度。Date logs由一些单独的data
log文件组成,缺省的文件大小是32M,如果某个消息的大小超过了data log文件的大小,那么可以修改配置以增加data
log文件的大小。如果某个data log文件中所有的消息都被成功消费了,那么这个data
log文件将会被标记,以便在下一轮的清理中被删除或者归档。以下是其配置的一个例子:
- <
broker
brokerName
=
"broker"
persistent
=
"true"
useShutdownHook
=
"false"
>
-
<
persistenceAdapter
>
-
<
amqPersistenceAdapter
directory
=
"${activemq.base}/data"
maxFileLength
=
"32mb"
/>
-
</
persistenceAdapter
>
- </
broker
>
- <
broker
brokerName
=
"broker"
persistent
=
"true"
useShutdownHook
=
"false"
>
- <
persistenceAdapter
>
- <
amqPersistenceAdapter
directory
=
"${activemq.base}/data"
maxFileLength
=
"32mb"
/>
- </
persistenceAdapter
>
- </
broker
>
Property name | Default value | Comments |
directory | activemq-data | the path to the directory to use to store the message store data and log files |
useNIO | true | use NIO to write messages to the data logs |
syncOnWrite | false | sync every write to disk |
maxFileLength | 32mb | a hint to set the maximum size of the message data logs |
persistentIndex | true | use a persistent index for the message logs. If this is false, an in-memory structure is maintained |
maxCheckpointMessageAddSize | 4kb | the maximum number of messages to keep in a transaction before automatically committing |
cleanupInterval | 30000 | time (ms) before checking for a discarding/moving message data logs that are no longer used |
indexBinSize | 1024 | default number of bins used by the index. The bigger the bin size - the better the relative performance of the index |
indexKeySize | 96 | the size of the index key - the key is the message id |
indexPageSize | 16kb | the size of the index page - the bigger the page - the better the write performance of the index |
directoryArchive | archive | the path to the directory to use to store discarded data logs |
archiveDataLogs | false | if true data logs are moved to the archive directory instead of being deleted |
2.3.2 Kaha Persistence
Kaha Persistence
是一个专门针对消息持久化的解决方案。它对典型的消息使用模式进行了优化。在Kaha中,数据被追加到data
logs中。当不再需要log文件中的数据的时候,log文件会被丢弃。以下是其配置的一个例子:
- <
broker
brokerName
=
"broker"
persistent
=
"true"
useShutdownHook
=
"false"
>
-
<
persistenceAdapter
>
-
<
kahaPersistenceAdapter
directory
=
"activemq-data"
maxDataFileLength
=
"33554432"
/>
-
</
persistenceAdapter
>
- </
broker
>
- <
broker
brokerName
=
"broker"
persistent
=
"true"
useShutdownHook
=
"false"
>
- <
persistenceAdapter
>
- <
kahaPersistenceAdapter
directory
=
"activemq-data"
maxDataFileLength
=
"33554432"
/>
- </
persistenceAdapter
>
- </
broker
>
2.3.3 JDBC Persistence
目前支持的数据库有Apache Derby, Axion, DB2,
HSQL, Informix, MaxDB, MySQL, Oracle, Postgresql, SQLServer, Sybase。
如果你使用的数据库不被支持,那么可以调整StatementProvider 来保证使用正确的SQL方言(flavour of
SQL)。通常绝大多数数据库支持以下adaptor:
- org.activemq.store.jdbc.adapter.BlobJDBCAdapter
- org.activemq.store.jdbc.adapter.BytesJDBCAdapter
- org.activemq.store.jdbc.adapter.DefaultJDBCAdapter
- org.activemq.store.jdbc.adapter.ImageJDBCAdapter
也可以在配置文件中直接指定JDBC adaptor,例如:
- <
jdbcPersistenceAdapter
adapterClass
=
"org.apache.activemq.store.jdbc.adapter.ImageBasedJDBCAdaptor"
/>
- <
jdbcPersistenceAdapter
adapterClass
=
"org.apache.activemq.store.jdbc.adapter.ImageBasedJDBCAdaptor"
/>
以下是其配置的一个例子:
- <
persistence
>
-
<
jdbcPersistence
dataSourceRef
=
" mysql-ds"
/>
- </
persistence
>
- <
bean
id
=
"mysql-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
=
"activemq"
/>
-
<
property
name
=
"password"
value
=
"activemq"
/>
-
<
property
name
=
"poolPreparedStatements"
value
=
"true"
/>
- </
bean
>
- <
persistence
>
- <
jdbcPersistence
dataSourceRef
=
" mysql-ds"
/>
- </
persistence
>
- <
bean
id
=
"mysql-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
=
"activemq"
/>
- <
property
name
=
"password"
value
=
"activemq"
/>
- <
property
name
=
"poolPreparedStatements"
value
=
"true"
/>
- </
bean
>
需要注意的是,如果使用MySQL,那么需要设置relaxAutoCommit 标志为true。
2.3.4 Disable Persistence
以下是其配置的一个例子:
- <
broker
persistent
=
"false"
>
- </
broker
>