使用MySQL進行ActiveMQ的消息持久化,並設置主從模式
1、MySQL數據庫的binlog日誌模式要設置爲 mixed 模式
2、設置使用數據庫鎖 useDatabaseLock="true" ,如果不設置,在主從模式下會報主鍵重複的異常。
- <persistenceAdapter>
- <jdbcPersistenceAdapter dataDirectory="${activemq.data}" dataSource="#mysql-ds" useDatabaseLock="true"
- lockKeepAlivePeriod="10000"/>
- </persistenceAdapter>
3、使用數據庫鎖的時候,master啓動後,slave由於數據庫鎖的原因,啓動時處於等待狀態,這時slave無法提供服務,當master當機後,數據庫鎖釋放,slave獲得數據庫鎖,可以提供服務。
4、雖然設置的主從模式,但當master當機時,接收者會有數據丟失問題,而且問題比較嚴重。考慮可能是由於沒有 Journal 的原因,但不知道爲什麼ActiveMQ 5.0以後版本不支持 journaledJDBC ,也可能是沒有找到正確的設置方法。(原因是在消息發送端設置了異步發送,導致發送和接收的消息數不一致,修改爲同步發送後,消息不丟失,發送和接收的消息數一致)
ActiveMQ使用MySQL進行持久化,並配置Master-Slave模式配置樣例:
Master:
- <beans
- xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
- http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="locations">
- <value>file:${activemq.conf}/credentials.properties</value>
- </property>
- </bean>
- <broker brokerName="broker-1-1" persistent="true" xmlns="http://activemq.apache.org/schema/core">
- <transportConnectors>
- <transportConnector name="default" uri="tcp://0.0.0.0:61616"/>
- </transportConnectors>
- <persistenceAdapter>
- <jdbcPersistenceAdapter dataDirectory="${activemq.data}" dataSource="#mysql-ds" useDatabaseLock="true"
- lockKeepAlivePeriod="10000"/>
- </persistenceAdapter>
- <systemUsage>
- <systemUsage sendFailIfNoSpaceAfterTimeout="3000">
- <memoryUsage>
- <memoryUsage limit="20 mb"/>
- </memoryUsage>
- <storeUsage>
- <storeUsage limit="100 mb"/>
- </storeUsage>
- <tempUsage>
- <tempUsage limit="50 mb"/>
- </tempUsage>
- </systemUsage>
- </systemUsage>
- <shutdownHooks>
- <bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" />
- </shutdownHooks>
- </broker>
- <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://127.0.0.1:3306/activemq?relaxAutoCommit=true&useUnicode=true&characterEncoding=UTF-8"/>
- <property name="username" value="root"/>
- <property name="password" value="neusoft"/>
- <property name="maxActive" value="200"/>
- <property name="poolPreparedStatements" value="true"/>
- </bean>
- <import resource="jetty.xml"/>
- </beans>
Slave:
- <beans
- xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
- http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="locations">
- <value>file:${activemq.conf}/credentials.properties</value>
- </property>
- </bean>
- <broker brokerName="broker-1-2" persistent="true"
- masterConnectorURI="tcp://127.0.0.1:61616" shutdownOnMasterFailure="false" xmlns="http://activemq.apache.org/schema/core">
- <transportConnectors>
- <transportConnector name="default" uri="tcp://0.0.0.0:61617"/>
- </transportConnectors>
- <persistenceAdapter>
- <jdbcPersistenceAdapter dataDirectory="${activemq.data}" dataSource="#mysql-ds" useDatabaseLock="true"
- lockKeepAlivePeriod="10000"/>
- </persistenceAdapter>
- <systemUsage>
- <systemUsage sendFailIfNoSpaceAfterTimeout="3000">
- <memoryUsage>
- <memoryUsage limit="20 mb"/>
- </memoryUsage>
- <storeUsage>
- <storeUsage limit="100 mb"/>
- </storeUsage>
- <tempUsage>
- <tempUsage limit="50 mb"/>
- </tempUsage>
- </systemUsage>
- </systemUsage>
- <shutdownHooks>
- <bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" />
- </shutdownHooks>
- </broker>
- <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://127.0.0.1:3306/activemq?relaxAutoCommit=true&useUnicode=true&characterEncoding=UTF-8"/>
- <property name="username" value="root"/>
- <property name="password" value="neusoft"/>
- <property name="maxActive" value="200"/>
- <property name="poolPreparedStatements" value="true"/>
- </bean>
- <import resource="jetty.xml"/>
- </beans>