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
- ActiveMQ的Networks of Broker部署方案
- ActiveMQ笔记(3):基于Networks of Brokers的HA方案
- ActiveMQ(6)-基于networkConnector的Broker-Cluster方案
- Understanding ActiveMQ Broker Networks - 理解ActiveMQ 网络模型
- ActiveMQ单机networks集群部署
- ActiveMQ的集群方案对比及部署
- ActiveMQ之三:启动ActiveMQ的Broker
- ActiveMQ的 HR + LB (高可用 + 负载均衡)部署方案
- ActiveMQ源码解析(五):聊聊activemq的broker集群
- activemq networks
- ActiveMQ 启动Broker
- activemq dynamic broker cluster
- ActiveMQ实现负载均衡+高可用部署方案 ActiveMQ
- ActiveMQ的安装部署
- activemq的部署(三)
- 解决ActiveMQ的“Invalid broker URI”异常的历程
- activemq的多个broker之间的消息共享
- activemq的多个broker之间的消息共享
- Android G711(PCMA/PCMU)、G726、PCM音频转码到AAC
- 1034: [ZJOI2008]泡泡堂BNB
- Leetcode||18. 4Sum
- “==”和equals的区别
- POJ 1218 THE DRUNK JAILER
- ActiveMQ的Networks of Broker部署方案
- SLAM的一点认识
- Swift 下开启warning提示方法
- CentOS学习19_centos6.5关闭transparent huge pages详细操作
- v8世界探险(3) - v8的抽象语法树结构
- Android XUtils框架
- 程序员福利:各大平台免费接口,非常实用
- 1191: [HNOI2006]超级英雄Hero
- VS2010下的OpenGL环境配置和使用