天天看點

ActiveMQ的持久化方式

ActiveMQ持久化方式:AMQ、KahaDB、JDBC、LevelDB。

1、AMQ

AMQ是一種檔案存儲形式,它具有寫入速度快和容易恢複的特點。消息存儲在一個個檔案中,檔案的預設大小為32M,如果一條消息的大小超過了32M,那麼這個值必須設定大一點。當一個存儲檔案中的消息已經全部被消費,那麼這個檔案将被辨別為可删除,在下一個清除階段,這個檔案被删除。AMQ适用于ActiveMQ5.3之前的版本。預設配置如下:

1

2

3

<persistenceAdapter>

   <amqPersistenceAdapter directory="activemq-data"maxFileLength="32mb"/>

</persistenceAdapter>

2、KahaDB

KahaDB是基于檔案的本地資料庫儲存形式,雖然沒有AMQ的速度快,但是它具有強擴充性,恢複的時間比AMQ短,從5.4版本之後KahaDB做為預設的持久化方式。預設配置如下:

1

2

3

<persistenceAdapter>

   <kahaDB directory="activemq-data"journalMaxFileLength="32mb"/>

</persistenceAdapter>

每個KahaDB的執行個體都可以配置單獨的擴充卡,如果沒有目标隊列送出給filteredKahaDB,那麼意味着對所有的隊列有效。如果一個隊列沒有對應的擴充卡,那麼将會抛出一個異常。配置如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<persistenceAdapter>

  <mKahaDBdirectory="${activemq.base}/data/kahadb">

    <filteredPersistenceAdapters>

      <!-- match all queues -->

      <filteredKahaDBqueue=">">

        <persistenceAdapter>

          <kahaDBjournalMaxFileLength="32mb"/>

        </persistenceAdapter>

      </filteredKahaDB>

      <!-- match all destinations -->

      <filteredKahaDB>

        <persistenceAdapter>

          <kahaDBenableJournalDiskSyncs="false"/>

        </persistenceAdapter>

      </filteredKahaDB>

    </filteredPersistenceAdapters>

  </mKahaDB>

</persistenceAdapter>

如果filteredKahaDB的perDestination屬性設定為true,那麼比對的目标隊列将會得到自己對應的KahaDB執行個體。配置如下:

1

2

3

4

5

6

7

8

9

10

11

12

<persistenceAdapter>

  <mKahaDBdirectory="${activemq.base}/data/kahadb">

    <filteredPersistenceAdapters>

      <!-- kahaDB per destinations -->

      <filteredKahaDB perDestination="true">

        <persistenceAdapter>

          <kahaDBjournalMaxFileLength="32mb" />

        </persistenceAdapter>

      </filteredKahaDB>

    </filteredPersistenceAdapters>

  </mKahaDB>

</persistenceAdapter>

3、JDBC

可以将消息存儲到資料庫中,例如:Mysql、SQL Server、Oracle、DB2。

配置JDBC擴充卡:

1

2

3

<persistenceAdapter>

    <jdbcPersistenceAdapterdataSource="#mysql-ds" createTablesOnStartup="false" />

</persistenceAdapter>

dataSource指定持久化資料庫的bean,createTablesOnStartup是否在啟動的時候建立資料表,預設值是true,這樣每次啟動都會去建立資料表了,一般是第一次啟動的時候設定為true,之後改成false。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26  

27

28

29

30

31

32

33

34

<!--Mysql持久化bean:à -->

<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>

<!-- SQL Server持久化bean:-->

<bean id="mssql-ds" class="net.sourceforge.jtds.jdbcx.JtdsDataSource" destroy-method="close">

   <property name="serverName" value="SERVERNAME"/>

   <property name="portNumber" value="PORTNUMBER"/>

   <property name="databaseName" value="DATABASENAME"/>

   <property name="user" value="USER"/>

   <property name="password" value="PASSWORD"/>

</bean>

<!-- Oracle持久化bean:-->

<bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>

    <property name="url" value="jdbc:oracle:thin:@10.53.132.47:1521:activemq"/>

    <property name="username" value="activemq"/>

    <property name="password" value="activemq"/>

    <property name="maxActive" value="200"/>

    <property name="poolPreparedStatements" value="true"/>

</bean>

<!-- DB2持久化bean:-->

<bean id="db2-ds" class="org.apache.commons.dbcp.BasicDataSource"  destroy-method="close">

      <property name="driverClassName" value="com.ibm.db2.jcc.DB2Driver"/>

      <property name="url" value="jdbc:db2://hndb02.bf.ctc.com:50002/activemq"/>

      <property name="username" value="activemq"/>

      <property name="password" value="activemq"/>

      <property name="maxActive" value="200"/>

      <property name="poolPreparedStatements" value="true"/>

  </bean>

4、LevelDB

這種檔案系統是從ActiveMQ5.8之後引進的,它和KahaDB非常相似,也是基于檔案的本地資料庫儲存形式,但是它提供比KahaDB更快的持久性。與KahaDB不同的是,它不是使用傳統的B-樹來實作對日志資料的提前寫,而是使用基于索引的LevelDB。預設配置如下:

1

2

3

<persistenceAdapter>

      <levelDBdirectory="activemq-data"/>

</persistenceAdapter>