activemq jdbc-master/slave集群搭建和客户端消费说明

来源:互联网 发布:网络语偷猪是什么意思 编辑:程序博客网 时间:2024/05/01 03:35

1、下载activemq客户端至linux系统,可以定义两个目录,在一台机器或者两台机器上都行。举例:建立目录mq/activemq1和mq/activemq2

2、解压安装mq,tar -xvf .......tar.gz

3、修改配置文件:

       /usr/mq/activemq2/apache-activemq-5.14.0/conf/active.xml文件和/usr/mq/activemq1/apache-activemq-5.14.0/conf/active.xml

4、修改内容如下:

修改broker名字和文件目录

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="mq1" useJmx="true"  dataDirectory="${activemq.data}">

增加持久化配

<persistenceAdapter>
            <jdbcPersistenceAdapter dataDirectory="${activemq.data}" dataSource="#mysql-ds" useDatabaseLock="true"/>
        </persistenceAdapter>

修改transport端口,防止冲突,如果在一台机器的话

 <transportConnectors>
            <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        </transportConnectors>

增加数据源配置

 <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://192.168.0.45:3306/mq?autoReconnect=true"/>  
        <property name="username" value="root"/>
        <property name="password" value="fruit@123"/>  
        <property name="poolPreparedStatements" value="true"/>  
    </bean>

注意:数据源的配置是在broker外面的


以上配置好了后,其他节点配置一致。在bin目录下启动:  ./activemq start即可。可以观察data目录下的log文件。

对于console,由于采用的是jetty作为内置容器,可以修改jetty的端口8161防止冲突。


其他配置过程中的问题,请参见我的其他文档。



java客户端引入:

生产端:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
">

<!-- 配置JMS连接工厂 -->
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="failover:(tcp://172.16.83.#:61616,tcp://172.16.83.#:61617)?randomize=false" />
</bean>

<!-- 定义消息队列(Queue) -->
<bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
<!-- 设置消息队列的名字 -->
<constructor-arg>
<value>financial_queue</value>
</constructor-arg>
</bean>

<!-- 配置JMS模板(Queue),Spring提供的JMS工具类,它发送、接收消息。 -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="defaultDestination" ref="queueDestination" />
<property name="receiveTimeout" value="10000" />
</bean>

<!--queue消息生产者 -->
<bean id="producerService" class="cn.cashier.service.mq.CashierQueueFactory">
<property name="jmsTemplate" ref="jmsTemplate"></property>
</bean>

</beans>


消费端:

<!-- 配置消息队列监听者(Queue),代码下面给出,只有一个onMessage方法

 <bean id="queueMessageListener" 
class="cn.account.service.mq.AccountQueueFactory" /> -->


<!-- 消息监听容器(Queue),配置连接工厂,监听的队列是queue2,监听器是上面定义的监听器 

<bean id="jmsContainer" 
class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
<property name="connectionFactory" ref="connectionFactory" /> <property name="destination" 
ref="queueDestination" /> <property name="messageListener" ref="queueMessageListener" 
/> </bean> -->


pom.xml:

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
<version>5.14.0</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-broker</artifactId>
<version>5.14.0</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>geronimo-j2ee-management_1.1_spec</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-protobuf</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>cn.hawtbuf</groupId>
<artifactId>hawtbuf</artifactId>
<version>1.11</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>geronimo-jms_1.1_spec</artifactId>
<version>1.1.1</version>
</dependency>


<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>


测试结果:



因为是采用mysql作为持久化机制,master会以数据库锁的方式争抢到锁,slave会进行定时获取锁,当master挂掉后,slave获取到锁,成为新的master,所以一定程度上,这种热备的standby,在小交易量的时候,可以支持。当高并发的时候,需要配合cluster进行部署。


可以在服务器关闭一台服务,可以发现,消息会进行正常的failover。

0 0
原创粉丝点击