2.3 Persistence
2.3.1 AMQ Message Store
??? AMQ Message Store是ActiveMQ5.0缺
省的持久化存儲(chǔ)。Message commands被保存到transactional journal(由rolling data
logs組成)。Messages被保存到data logs中,同時(shí)被reference store進(jìn)行索引以提高存取速度。Date
logs由一些單獨(dú)的data log文件組成,缺省的文件大小是32M,如果某個(gè)消息的大小超過了data
log文件的大小,那么可以修改配置以增加data log文件的大小。如果某個(gè)data log文件中所有的消息都被成功消費(fèi)了,那么這個(gè)data
log文件將會(huì)被標(biāo)記,以便在下一輪的清理中被刪除或者歸檔。以下是其配置的一個(gè)例子:
-
<
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 是一個(gè)專門針對(duì)消息持久化的解決方案。它對(duì)典型的消息使用模式進(jìn)行了優(yōu)化。在Kaha中,數(shù)據(jù)被追加到data logs中。當(dāng)不再需要log文件中的數(shù)據(jù)的時(shí)候,log文件會(huì)被丟棄。以下是其配置的一個(gè)例子:
-
<
broker
?
brokerName
=
"broker"
?
persistent
=
"true"
?
useShutdownHook
=
"false"
>
??
-
??????<persistenceAdapter>??
-
????????<kahaPersistenceAdapter?directory="activemq-data"?maxDataFileLength="33554432"/>??
-
??????</persistenceAdapter>??
-
</
broker
>
??
?
2.3.3 JDBC Persistence
??? 目前支持的數(shù)據(jù)庫有Apache Derby, Axion, DB2, HSQL, Informix, MaxDB, MySQL, Oracle, Postgresql, SQLServer, Sybase。
??? 如果你使用的數(shù)據(jù)庫不被支持,那么可以調(diào)整StatementProvider 來保證使用正確的SQL方言(flavour of SQL)。通常絕大多數(shù)數(shù)據(jù)庫支持以下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"
/>
??
??? 以下是其配置的一個(gè)例子:
?
- <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,那么需要設(shè)置relaxAutoCommit 標(biāo)志為true。
?
2.3.4 Disable Persistence
??? 以下是其配置的一個(gè)例子:
- <broker?persistent="false">??
- </broker>