2016年7月13日星期三

ActiveMQ_034:为每一个 Queue 配置一个 KahaDB 实例

环境:MAC OS X 10.11.5 + ActiveMQ 5.13.3

默认情况下,某个 KahaDB 文件存储了所有 Queue 的未处理消息。
实际使用中,有些 Queue 的消费速度快,有些 Queue 的消费速度慢,这样不利于 KahaDB 文件的清除。

在这种情况下,可以使用 mKahaDB,为每一个 Queue 配置一个  KahaDB 实例。

1. 修改 activemq.xml 中的 persistenceAdapter 部分

<persistenceAdapter>
  <!--<kahaDB directory="/tmp/kahadb"/>-->
  <mKahaDB directory="${activemq.base}/data/kahadb">
    <filteredPersistenceAdapters>
      <!-- kahaDB per destinations -->
      <filteredKahaDB perDestination="true">
        <persistenceAdapter>
          <kahaDB journalMaxFileLength="32mb"/>
        </persistenceAdapter>
      </filteredKahaDB>
    </filteredPersistenceAdapters>
  </mKahaDB>
</persistenceAdapter>

2. 启动 ActiveMQ
./activemq-node3/bin/activemq console xbean:activemq-node3-master-slave.xml

3. 分别向 testQueue1 和 testQueue2 发送消息
(1)向 testQueue1 发送消息
./activemq-node3/bin/activemq producer --brokerUrl tcp://localhost:61619 --user admin --password admin --destination queue://testQueue1 --messageSize 1024 --messageCount 1000 --parallelThreads 10
(2)向 testQueue2 发送消息
./activemq-node3/bin/activemq producer --brokerUrl tcp://localhost:61619 --user admin --password admin --destination queue://testQueue2 --messageSize 1024 --messageCount 1000 --parallelThreads 10

4. 查看 KahaDB 目录
发现在 /data/kahadb/ 目录下,生成了 queue#3a#2f#2ftestQueue1 和 
queue#3a#2f#2ftestQueue2 目录。
在这两个目录下,分别有 testQueue1 和 testQueue2 的 db-1.log、db.data、db.redo 文件。
说明每个 Queue 的持久化 KahaDB 文件是各自独立分开存储的。

参考文献:
1. http://blog.garytully.com/2011/11/activemq-multiple-kahadb-instances.html
2. https://access.redhat.com/documentation/en-US/Fuse_MQ_Enterprise/7.1/html/Configuring_Broker_Persistence/files/FuseMBMultiKahaDB.html