首先要下載 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:
張貼留言