ActiveMQ的Networks of Broker部署方案

来源:互联网 发布:最新淘宝直播怎么申请 编辑:程序博客网 时间:2024/05/16 01:56

1、下载activeMQ安装包http://activemq.apache.org/download-archives.html

2、修改conf文件下的activemq.xml文件,添加登录验证和networkConnector,如下:

     

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="broker-2" dataDirectory="${activemq.data}">   <plugins>               <simpleAuthenticationPlugin>                   <users>                       <authenticationUser username="${activemq.username}" password="${activemq.password}" groups="users,admins"/>                   </users>               </simpleAuthenticationPlugin>           </plugins>       <networkConnectors>           <networkConnector uri="static:(tcp://127.0.0.1:61616)"  userName="system" password="manager"/>        </networkConnectors>   ......</broker>
用户名和密码在conf/credentials.properties中,这个broker-2的tansportConnectors
<transportConnectors>            <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->            <transportConnector name="openwire" uri="tcp://0.0.0.0:61626?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>            <transportConnector name="amqp" uri="amqp://0.0.0.0:5675?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>            <transportConnector name="stomp" uri="stomp://0.0.0.0:61619?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>            <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1886?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>            <transportConnector name="ws" uri="ws://0.0.0.0:61615?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>        </transportConnectors>
它的端口号是61626,而broker-1的端口号是61616,由于是在一台机器上模拟两个broker,

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="broker-1" dataDirectory="${activemq.data}"> <plugins>               <simpleAuthenticationPlugin>                   <users>                       <authenticationUser username="${activemq.username}" password="${activemq.password}" groups="users,admins"/>                   </users>               </simpleAuthenticationPlugin>           </plugins><networkConnectors>           <networkConnector uri="static:(tcp://127.0.0.1:61626)"  userName="system" password="manager"/>        </networkConnectors>
 .......
</broker>

本人将activeMQ安装包复制一份,将端口号修改一下,如果在管理界面http://localhost:8161/admin/ 同时查看两broker的情况,需要在路径conf/jetty.xml中将一个端口号修改为8162(只要不是8161就行)。配置networkConnector的目的使这两台broker负载均衡,当broker-1上的消息队列有100个消息时,但是没有消费者来消费或者消费者消费的能力低,导致大量消息积压在队列中,如果配置networkConnector,它里面有其他broker的ip和端口号,本例中是broker-2,broker-2上有一个消费,但是broker-2的myQueues队列中没有消息,此时broker-2上的消费者就可以消费,broke-1中的消息,即使broker-1的服务器宕机了,也能消费。

下面写一个demo来演示

maven工程的pom依赖

<properties>     <spring.version>4.2.5.RELEASE</spring.version> </properties> <dependencies>     <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-core</artifactId>            <version>${spring.version}</version>        </dependency>                <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-beans</artifactId>            <version>${spring.version}</version>        </dependency>                <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context</artifactId>            <version>${spring.version}</version>        </dependency>                 <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-jms</artifactId>            <version>4.2.3.RELEASE</version>        </dependency>                <dependency>            <groupId>org.apache.activemq</groupId>            <artifactId>activemq-all</artifactId>            <version>5.13.2</version>        </dependency>                <dependency>            <groupId>org.apache.commons</groupId>            <artifactId>commons-pool2</artifactId>            <version>2.4.2</version>        </dependency>                 <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.12</version>        </dependency>          </dependencies>

在src/main/resources下新建一个application.xml

<?xml version="1.0" encoding="UTF-8"?><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">        <bean id="poolConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">          <property name="connectionFactory">              <bean class="org.apache.activemq.ActiveMQConnectionFactory">                  <!--broker服务的地址-->                 <property name="brokerURL" value="failover:(tcp://localhost:61616,tcp://localhost:61626)"/>                 <!--默认值为1000,如果不需要这么大,可以调小-->                 <property name="maxThreadPoolSize" value="100"/>                 <property name="userName" value="system"/>                 <property name="password" value="manager"/>             </bean>         </property>     </bean>      <bean id="queue" class="org.apache.activemq.command.ActiveMQQueue">         <!--队列名称-->         <property name="physicalName" value="myQueues"/>     </bean>         <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">        <property name="connectionFactory" ref="poolConnectionFactory"/>         <!--默认的队列-->         <property name="defaultDestination" ref="queue"/>         <!--接收超时时间10秒-->         <property name="receiveTimeout" value="10000"/>     </bean>  </beans>

分别写一个生产者和消费者类

public class Producer {public static final int AMOUNT = 100;public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");// 连接工场,JMS用它创建连接PooledConnectionFactory factory = (PooledConnectionFactory) context.getBean("poolConnectionFactory");ActiveMQQueue destination =  (ActiveMQQueue)context.getBean("queue");try {// 创建连接对象,启动连接Connection connection = factory.createConnection();connection.start();// 自动确认模式,不需要反馈就将消息从队列中删除Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);MessageProducer producer = session.createProducer(destination);System.out.println("hint:准备发送消息....");long start = System.currentTimeMillis();for(int i=1;i<=AMOUNT;i++){TextMessage message = session.createTextMessage("第"+i+"条消息");producer.send(message);}long time = System.currentTimeMillis() - start;int speed = Double.valueOf(AMOUNT / (time/1000)).intValue();System.out.print("发送 " + AMOUNT + " 条消息,耗时:" + time + "毫秒,平均" + speed + "条/秒");connection.close();} catch (JMSException e) {e.printStackTrace();}}}


public class Consumer {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");// 连接工场,JMS用它创建连接PooledConnectionFactory factory = (PooledConnectionFactory) context.getBean("poolConnectionFactory");ActiveMQQueue destination =  (ActiveMQQueue)context.getBean("queue");try {Connection connection = factory.createConnection();connection.start();//  选用客户端确认模式,即消息处理完成后再将消息从消息队列中删除 Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);MessageConsumer consumer = session.createConsumer(destination);consumer.setMessageListener(new ActiveMQListener());            } catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();}}static public class ActiveMQListener implements MessageListener{public void onMessage(Message message) {try {if(message instanceof TextMessage){System.out.println("消费了 "+((TextMessage)message).getText());// 收到消息后,进行确认message.acknowledge();}} catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

运行\bin\win64下ativemq.bat文件,同时将broker-1和broker-2启动,圈红框第一处表示broker-2到broker-1的单向network connector连接已经建立,第二处表示网址链接可以访问了,broke-1到broker-2的启动信息和这个差不多,就省略了。



先运行生产者程序,在控制台的信息


点击连接http://localhost:8161/admin/可以查看到broker-1中myQueues队列中已经有100条信息


运行消费者程序

进入broker-2的链接http://localhost:8162/admin/查看到它的myQueues队列中信息(两个broker之间建立networkConnector后相同名字的队列消息可以互相消费)


控制台信息如下



参考文章

http://www.cnblogs.com/yjmyzz/p/activemq-sample.html

http://www.cnblogs.com/yjmyzz/p/activemq-ha-using-networks-of-brokers.html

http://greemranqq.iteye.com/blog/2194051








0 0
原创粉丝点击