天天看點

【ActiveMQ入門-5】ActiveMQ學習-消息持久性

ActiveMQ中的消息持久性

    ActiveMQ很好的支援了消息的持久性(Persistence)。消息持久性對于可靠消息傳遞來說應該是一種比較好的方法,有了消息持久化,即使發送者和接受者不是同時線上或者消息中心在發送者發送消息後當機了,在消息中心重新啟動後仍然可以将消息發送出去,如果把這種持久化和ReliableMessaging結合起來應該是很好的保證了消息的可靠傳送。

    消息持久性的原理很簡單,就是在發送者将消息發送出去後,消息中心首先将消息存儲到本地資料檔案、記憶體資料庫或者遠端資料庫等,然後試圖将消息發送給接收者,發送成功則将消息從存儲中删除,失敗則繼續嘗試。消息中心啟動以後首先要檢查制定的存儲位置,如果有未發送成功的消息,則需要把消息發送出去。

    對于ActiveMQ,消息的持久化同樣是很簡單的,僅僅通過配置資訊就可以實作。這裡主要介紹兩種不同的持久化方法。

1.High performance journal

    這是ActiveMQ基于開源的HOWL(High-speed ObjectWeb Logger),将HOWL擴充為可以存儲任意大小的消息(HOWL隻能存儲固定大小的記錄),實作的一種消息持久化方法。它可以快速的将消息存儲在本地檔案中,且這種檔案是以一種類似資料庫的方式管理的。這樣,如果你發送了10,000個消息,可能隻有很少數的消息沒有發送成功,當達到一個checkpoint的時候,journal将一批未成功消息通過JDBC存儲到資料庫,這樣避免了多次的資料庫操作,很大程度上提高了性能并且保證了可靠性。

    配置方法非常簡單,就是無需配置,呵呵。ActiveMQ預設支援Journal,在activemq.xml配置檔案中,可以找到如下資訊:

<persistenceAdapter>

    <journaledJDBC journalLogFiles="5" journalLogFileSize="1024" dataDirectory="${activemq.home}/activemq-data"/>

</persistenceAdapter>

這裡可以改動的就是journalLogFiles,這個屬性是制定預設建立幾個資料檔案來存儲消息。journalLogFileSize為資料檔案大小,預設為20MB。dataDirectory指向了存儲資料檔案的位置。

2.使用MySQL進行消息持久化

    ActiveMQ持久幾乎所有資料庫(因為是通過JDBC把消息存儲到資料庫的)。方法同樣簡單,就是配置資訊稍微有點變化。

<persistenceAdapter>

    <jdbcPersistenceAdapter dataSource="#mysql-ds"/>

</persistenceAdapter>

其中dataSource指定了所用資料源的名字為mysql-ds。需要在activemq.xml檔案中的<broker>标簽之外配置資料源。下面是MySql的配置資訊。

<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="gos2"/>

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

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

</bean>

    大多數資訊的含義是很清楚的,需要注意的是relaxAutoCommit需要設定為true,不知道什麼含義。不同資料庫的配置資訊可能有些不一樣,還需要自己再查一下。

    配置檔案修改好之後,将所選資料庫的JDBC驅動包下載下傳之後放到%ACTIVEMQ_HOME%\lib\下,然後啟動%ACTIVEMQ_HOME%\bin\activemq.bat。

問題解決

需要注意的一個地方是:ActiveMQ使用MySQL持久化消息是,需要首先建立資料庫,上面配制資訊中可以看到,資料庫的名字是activemq。啟動activemq.bat之後,會在資料庫中建立表。我使用MySQL4.1,出現了max key lengh...錯誤,原因就是ActiveMQ建立的表使用三個字段的組合作為主鍵,每個字段時varchar(250),加起來是750個varchar,如果按一個verchar2個位元組(據說如果采用utf-8編碼,可能會是3個位元組??),超出了MySQL允許的1024位元組。我曾試圖更改MySQL的設定,沒有成功,最後手動的那控制台列印出來的SQL語句中的250都換成了100,建立了這個表,然後把其他建立的表删掉。然後重新啟動activemq.bat,成功!!!:)

程式設定持久化

    這樣,消息中心具有了消息持久化功能,還需要做的就是消息發送者在發送消息的時候要采用JMS中的PERSISTENT模式發送消息。示例代碼如下:

MessageProducer producer = session.createProducer(destination);

producer.setDeliveryMode(DeliveryMode.PERSISTENT);

// 如果不想持久化可用下面語句

//producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

這樣,你的消息無論怎麼發,都可以成功了。