自从activemq5.9.0开始,activemq的集群实现方式取消了传统的Pure Master Slave方式,增加了基于zookeeper+leveldb的实现方式,其他两种方式:目录共享和数据库共享依然存在。

1、Master-Slave部署方式 
1)、Shared Filesystem Master-Slave方式 
2)、Shared Database Master-Slave方式 
3)、Replicated LevelDB Store方式

第一种方案同样支持N个AMQ实例组网,但由于他是基于kahadb存储策略,亦可以部署在分布式文件系统上,应用灵活、高效且安全。

第二种方案与shared filesystem方式类似,只是共享的存储介质由文件系统改成了数据库而已,支持N个AMQ实例组网,但他的性能会受限于数据库;

第三种方案是ActiveMQ5.9以后才新增的特性,使用ZooKeeper协调选择一个node作为master。被选择的master broker node开启并接受客户端连接。 
其他node转入slave模式,连接master并同步他们的存储状态。slave不接受客户端连接。所有的存储操作都将被复制到连接至Master的slaves。 
如果master死了,得到了最新更新的slave被允许成为master。fialed node能够重新加入到网络中并连接master进入slave mode。所有需要同步的disk的消息操作都将等待存储状态被复制到其他法定节点的操作完成才能完成。所以,如果你配置了replicas=3,那么法定大小是(3/2)+1=2. Master将会存储并更新然后等待 (2-1)=1个slave存储和更新完成,才汇报success。至于为什么是2-1,熟悉Zookeeper的应该知道,有一个node要作为观擦者存在。 
单一个新的master被选中,你需要至少保障一个法定node在线以能够找到拥有最新状态的node。这个node将会成为新的master。因此,推荐运行至少3个replica nodes,以防止一个node失败了,服务中断。

Shared Filesystem Master-Slave方式

shared filesystem Master-Slave部署方式主要是通过共享存储目录来实现master和slave的热备,所有的ActiveMQ应用都在不断地获取共享目录的控制权,哪个应用抢到了控制权,它就成为master。

多个共享存储目录的应用,谁先启动,谁就可以最早取得共享目录的控制权成为master,其他的应用就只能作为slave。

一、下载activeMQ解压并复制3份

二、修改配置文件conf下面 activemq.xml

如下 ,3份文件broker都修改为一致  其中dataDirectory 是 数据存储共享目录地址

修改 kahaDB目录地址为数据存储共享目录地址

修改openwire  的tcp 连接地址端口分别为 61616 61626 61636

二 、修改conf 下面的 jetty.xml文件,修改管理界面端口 8161 8162 8163 方便测试查看启动的那一个activemq服务

三、启动  成功了一个后面的将阻塞等待获取锁

四、测试

Receiver.java
package com.activemq.demo;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory; public class Receiver {
public static void main(String[] args) {
// ConnectionFactory :连接工厂,JMS 用它创建连接
ConnectionFactory connectionFactory;
// Connection :JMS 客户端到JMS Provider 的连接
Connection connection = null;
// Session: 一个发送或接收消息的线程
Session session;
// Destination :消息的目的地;消息发送给谁.
Destination destination;
// 消费者,消息接收者
MessageConsumer consumer;
connectionFactory = new ActiveMQConnectionFactory(
"failover:(tcp://localhost:61616,tcp://localhost:61626,tcp://localhost:61636)");
try {
// 构造从工厂得到连接对象
connection = connectionFactory.createConnection();
// 启动
connection.start();
// 获取操作连接
session = connection.createSession(Boolean.FALSE,
Session.AUTO_ACKNOWLEDGE);
// 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置
destination = session.createQueue("FirstQueue");
consumer = session.createConsumer(destination);
while (true) {
//设置接收者接收消息的时间,为了便于测试,这里谁定为100s
TextMessage message = (TextMessage) consumer.receive(100000);
if (null != message) {
System.out.println("收到消息" + message.getText());
} else {
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != connection)
connection.close();
} catch (Throwable ignore) {
}
}
}
}

 Sender.java

package com.activemq.demo;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory; public class Sender {
private static final int SEND_NUMBER = 5; public static void main(String[] args) {
// ConnectionFactory :连接工厂,JMS 用它创建连接
ConnectionFactory connectionFactory;
// Connection :JMS 客户端到JMS Provider 的连接
Connection connection = null;
// Session: 一个发送或接收消息的线程
Session session;
// Destination :消息的目的地;消息发送给谁.
Destination destination;
// MessageProducer:消息发送者
MessageProducer producer;
// TextMessage message;
// 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar
connectionFactory = new ActiveMQConnectionFactory(
"failover:(tcp://localhost:61616,tcp://localhost:61626,tcp://localhost:61636)");
try {
// 构造从工厂得到连接对象
connection = connectionFactory.createConnection();
// 启动
connection.start();
// 获取操作连接
session = connection.createSession(Boolean.TRUE,
Session.AUTO_ACKNOWLEDGE);
// 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置
destination = session.createQueue("FirstQueue");
// 得到消息生成者【发送者】
producer = session.createProducer(destination);
// 设置不持久化,此处学习,实际根据项目决定 ---- 集群此处必须持久化
// producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
// 构造消息,此处写死,项目就是参数,或者方法获取
sendMessage(session, producer);
session.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != connection)
connection.close();
} catch (Throwable ignore) {
}
}
} public static void sendMessage(Session session, MessageProducer producer)
throws Exception {
for (int i = 1; i <= SEND_NUMBER; i++) {
TextMessage message = session
.createTextMessage("ActiveMq 发送的消息" + i);
// 发送消息到目的地方
System.out.println("发送消息:" + "ActiveMq 发送的消息" + i);
producer.send(message);
}
}
}

  

最新文章

  1. 你真的会玩SQL吗?和平大使 内连接、外连接
  2. 升级Ubuntu 16.04 LTS后 DSL拨号上网(ppp)连接自动断开解决办法
  3. 安装Ubuntu的那些事儿(续)
  4. Bar菜单
  5. 4M宽带一般最大的下载速度是多少?
  6. Beta项目冲刺汇总贴
  7. ANDROID_MARS学习笔记_S01原始版_022_MP3PLAYER002_本地及remote标签
  8. [HeadFirst-JSPServlet学习笔记][第一章:前言与概述]
  9. Problem D: Flip Five
  10. JQuery笔记(三)选项卡
  11. PHP那些最好的轮子
  12. Uip学习简介及网址
  13. vue零基础学习--搭建项目
  14. Spark RPC框架源码分析(一)简述
  15. 使用git clone命令克隆github项目到本地时出错,提示没有权限的解决方法
  16. Web 测试总结
  17. 机器学习技法笔记:16 Finale
  18. Javascript导航菜单13则
  19. 第一遍练习:手抄一份 CRUD 并上传截图
  20. 开启Win7多用户登录远程桌面

热门文章

  1. 【python+opencv】轮廓发现
  2. 【解决】win10 启用系统保护 灰色 不可选 的解决办法
  3. dedecms文章页调用地址(当前文章URL)如何操作?
  4. NYOJ 587 blockhouses 【DFS】
  5. 自定义WordPress文件上传路径
  6. [py]戏说python面向对象细节
  7. (转)跨域的另一种解决方案——CORS(Cross-Origin Resource Sharing)跨域资源共享
  8. HDU1010:Tempter of the Bone(dfs+剪枝)
  9. POJ3096:Surprising Strings(map)
  10. soapUI-Groovy Script