這文章是在網上看到的,還沒來得及實驗,先拿下來再說。 也不知道是不是原創,網址如下http://zhaiyl.spaces.live.com/blog/cns!939A197D2798715B!125.entry
ActiveMQ很好的支援了訊息的持久性(Persistence)。訊息持久性對於可靠訊息傳遞來說應該是一種比較好的方法,有了訊息持久化,即使寄件者和接受者不是同時線上或者訊息中心在寄件者發送訊息後宕機了,在訊息中心重新啟動後仍然可以將訊息發送出去,如果把這種持久化和 ReliableMessaging結合起來應該是很好的保證了訊息的可靠傳送。
訊息持久性的原理很簡單,就是在寄件者將訊息發送出去後,訊息中心首先將訊息儲存到本機資料檔案、記憶體資料庫或者遠端資料庫等,然後試圖將訊息發送給接收者,發送成功則將訊息從儲存中刪除,失敗則繼續嘗試。訊息中心啟動以後首先要檢查制定的儲存位置,如果有未發送成功的訊息,則需要把訊息發送出去。
對於ActiveMQ,訊息的持久化同樣是很簡單的,僅僅通過配置資訊就可以實現。這裡主要介紹兩種不同的持久化方法。
- High performance journal
這是ActiveMQ基於開源的HOWL(High-speed ObjectWeb Logger),將HOWL擴充為可以儲存任意大小的訊息(HOWL只能儲存固定大小的記錄),實現的一種訊息持久化方法。它可以快速的將訊息儲存在本地檔案中,且這種檔案是以一種類似資料庫的方式管理的。這樣,如果你發送了10,000個訊息,可能只有很少數的訊息沒有發送成功,當達到一個 checkpoint的時候,journal將一批未成功訊息通過JDBC儲存到資料庫,這樣避免了多次的資料庫操作,很大程度上提高了效能並且保證了可靠性。
配置方法非常簡單,就是無需配置,呵呵。ActiveMQ預設支援Journal,在activemq.xml設定檔中,可以找到如下資訊:Code:
<persistenceAdapter><br /> <journaledJDBC journalLogFiles="5" journalLogFileSize="1024" dataDirectory="${activemq.home}/activemq-data"/><br /> </persistenceAdapter>
[Ctrl+A Select All]
這裡可以改動的就是journalLogFiles,這個屬性是制定預設建立幾個資料檔案來儲存訊息。journalLogFileSize為資料檔案大小,預設為20MB。dataDirectory指向了儲存資料檔案的位置。
- 使用MySQL進行訊息持久化
ActiveMQ持久幾乎所有資料庫(因為是通過JDBC把訊息儲存到資料庫的)。方法同樣簡單,就是配置資訊稍微有點變化。Code:
<persistenceAdapter><br /> <jdbcPersistenceAdapter dataSource="#mysql-ds"/><br /> </persistenceAdapter><br />
[Ctrl+A Select All]
其中dataSource指定了所用資料來源的名字為mysql-ds。需要在activemq.xml檔案中的<broker>標籤之外配置資料來源。下面是MySql的配置資訊。
Code:
<bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><br /> <property name="driverClassName" value="com.mysql.jdbc.Driver"/><br /> <property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/><br /> <property name="username" value="gos2"/><br /> <property name="password" value="gos2"/><br /> <property name="poolPreparedStatements" value="true"/><br /> </bean><br />
[Ctrl+A Select All]
大多數資訊的含義是很清楚的,需要注意的是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模式發送訊息。範例程式碼如下:
Code:
<br /> MessageProducer producer = session.createProducer(destination);<br /> producer.setDeliveryMode(DeliveryMode.PERSISTENT);<br /> /<br /> / 如果不想持久化可用下面語句<br /> //producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);<br />
[Ctrl+A Select All]
這樣,你的訊息無論怎麼發,都可以成功了。