2011-10-07

【系統】ActiveMQ : JDBC Persistence Adapter With PostgreSQL

這裡來講一下怎麼設定 JDBC Persistence Adapter 使用 PostgreSQL。
首先要下載 JDBC Driver for PG
【 If you are using the 1.6 or 1.7 JVM, then you should use the JDBC4 version. 】  

所以我下載 JDBC4 Postgresql Driver, Version 9.1-901
# cd /home/activemq/lib
# wget http://jdbc.postgresql.org/download/postgresql-9.1-901.jdbc4.jar
接著要改ActiveMQ的設定檔 /home/activemq/conf/activemq.xml
<broker ...>
...
    <persistenceAdapter>
        <jdbcPersistenceAdapter dataSource="#pg-ds" useDatabaseLock="false">
            <statements>
                <statements messageTableName="amq_msg"  lockTableName="amq_lock"  durableSubAcksTableName="amq_acks"/>
            </statements>
        </jdbcPersistenceAdapter>
    </persistenceAdapter>
...
</broker>

<bean id="pg-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="org.postgresql.Driver"/>
    <property name="url" value="jdbc:postgresql://10.10.10.10:5432/db"/>
    <property name="username" value="username"/>
    <property name="password" value="password"/>
    <property name="maxActive" value="10"/>
    <property name="poolPreparedStatements" value="true"/>
</bean>
照理說上面這段應該可以很正常的執行。
但發現 ActiveMQ 5.5.0 似乎有bug。
只要指定 durableSubAcksTableName 就會出錯。
後來去看 Log。訊息是
2011-10-07 15:06:16,091 | WARN  | Failure details: ERROR: constraint "activemq_acks_pkey" of relation "amq_acks" does not exist
發現一個怪地方,constraint 應該是我指定的名稱 amq_acks_pkey 才對,怎麼他還是用 activemq_acks_pkey.
這個 Bug 搞了我很久…,完全沒想到會有這個 BUG,真是讓我無言了。

最後我用的方式挺鳥的,但能用就好。
我就把 durableSubAcksTableName="amq_acks" 先拿掉,
這樣系統就會自動用 activemq_acks 來當 Table Name。
然後啟動 ActiveMQ,就順利啟動了,然後去DB看,也建了三個Table
二個我指定的名稱
amq_msg ,amq_lock
還有一個是他使用預設名稱的
activemq_acks

接著自己手動把Table activemq_acks 更名為 amq_acks
再把 activemq.xml 中的 durableSubAcksTableName="amq_acks" 加回去。
然後再重啟ActiveMQ,這次就可以正常啟動了。
因為它看資料庫中都有Table了,就不會再去建了,就會跳過那段錯誤的地方了。

因為我們是讓不同的ActiveMQ Server,都有自己的 Table。
所以要指定個別 Table 名稱,這樣才不會寫到同一個 Table。

下一個版本應該就不會有這個問題了。
如果沒有要特別指定Table Name,就可以把 statements 整個 Block 拿掉。
用它預設的跑就會很順利了。





0 comments:

張貼留言