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 >