2019独角兽企业重金招聘Python工程师标准>>>

什么叫中间件?
中间件为软件应用提供了操作系统所提供的服务之外的服务,可以把中间件描述为"软件胶水"。中间件不是操作系统的一部分,不是数据库操作系统,也不是应用软件的一部分,而是能够让软件开发者方便的处理通信、输入和输出,能够专注自己应用的部分。

消息中间件解决了应用之间的消息传递、解耦、异步的问题。
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

一般中间件都提供了横向扩展和纵向扩展,横向扩展就是我们经常说的负载均衡,纵向扩展提供了Master-Slaver;

负载均衡:提供负载均衡的中间件都对外提供服务
Master-Slaver:同时只有一个中间件对外提供服务,当Master出现挂机等问题,Slaver会自动接管

看一个整合的简图:

当然activemq也提供了以上2中方式,分别是:Master-Slave和Broker Cluster

准备:
jdk1.6,apache-activemq-5.10.0,mysql5.1,zookeeper-3.4.3

先来看看Master-Slave模式

1).Shared File System Master Slave
基于ActiveMQ的默认数据库kahaDB完成的,kahaDB的底层是文件系统。这种方式的集群,Slave的个数没有限制,哪个ActiveMQ实例先获取共享文件的锁,那个实例就是Master,其它的ActiveMQ实例就是Slave,当当前的Master失效,其它的Slave就会去竞争共享文件锁,谁竞争到了谁就是Master

本次测试在同一台机器上:
首先更改配置conf/activemq,做如下修改:

<persistenceAdapter><!--<kahaDB directory="${activemq.data}/kahadb"/>--><kahaDB directory="D:/kahaDB"/></persistenceAdapter>

将activemq拷贝3份,分别:apache-activemq-5.10.0-M1, apache-activemq-5.10.0-M2,apache-activemq-5.10.0-M3,分别启动activemq命令,启动的日志分别是:

表示当前进程是Master

表示当前进程没有获取到锁,作为Slaver

测试:

下面的例子中分别提供了Producer(Sender类)和Consumer(Receiver类)
我们首先用Producer发送消息给activemq,然后停止Master,然后再用Consumer接受消息,测试结果是可以接受到数据的。

2).JDBC Master Slave
JDBC Master Slave模式和Shared File Sysytem Master Slave模式的原理是一样的,只是把共享文件系统换成了共享数据库。

修改配置文件conf/activemq

<persistenceAdapter><!--<kahaDB directory="${activemq.data}/kahadb"/>--><!--<kahaDB directory="D:/kahaDB"/>--><jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" dataSource="#mysql-ds"/> </persistenceAdapter>

添加数据源:

<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://localhost/activemq?relaxAutoCommit=true"/><property name="username" value="root"/><property name="password" value="root"/><property name="poolPreparedStatements" value="true"/></bean>

注:这里使用的是mysql,所以需要mysql驱动程序: mysql-connector-java-5.1.18,讲jar包放入lib文件夹下面,驱动版本不对,会出现如下错误: Database lock driver override not found for : [mysql_connect ...

分别拷贝到其他几个文件夹下,分别启动,启动成功后我们可以看到数据库中多了几张表:

测试方式同上;
官网手册:http://activemq.apache.org/jdbc-master-slave.html

3).Replicated LevelDB Store
这种方式是ActiveMQ5.9以后才新增的特性,使用ZooKeeper协调选择一个node作为master

修改配置文件conf/activemq:

<!--<persistenceAdapter><kahaDB directory="${activemq.data}/kahadb"/><kahaDB directory="D:/kahaDB"/><jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" dataSource="#mysql-ds"/> </persistenceAdapter>--><persistenceAdapter><replicatedLevelDBdirectory="${activemq.data}/leveldb"replicas="3"bind="tcp://0.0.0.0:0"zkAddress="127.0.0.1:2181"hostname="127.0.0.1"sync="local_disk"zkPath="/activemq/leveldb-stores"/></persistenceAdapter>

首先启动zookeeper,这里没有做集群处理,默认端口是2181,然后分别启动activemq,
启动之后报错:"activemq LevelDB IOException handler"。

原因:版本5.10.0存在的依赖冲突。

解决方案:
(1)移除lib目录中的pax-url-aether-1.5.2.jar包
(2)注释掉配置文件中的日志配置;

<!-- Allows accessing the server log<bean id="logQuery" class="org.fusesource.insight.log.log4j.Log4jLogQuery"lazy-init="false" scope="singleton"init-method="start" destroy-method="stop"></bean>
-->

测试方式同上;

提供java版的例子:

public class Sender {private static final int SEND_NUMBER = 5;public static void main(String[] args) {ConnectionFactory connectionFactory;Connection connection = null;Session session;Destination destination;MessageProducer producer;connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");try {connection = connectionFactory.createConnection();connection.start();session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);destination = session.createQueue("FirstQueue");producer = session.createProducer(destination);producer.setDeliveryMode(DeliveryMode.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("发送的消息"+ i);System.out.println("发送消息:" + "ActiveMq 发送的消息" + i);producer.send(message);}}
}
public class Receiver {public static void main(String[] args) {ConnectionFactory connectionFactory;Connection connection = null;Session session;Destination destination;MessageConsumer consumer;connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");try {connection = connectionFactory.createConnection();connection.start();session = connection.createSession(Boolean.FALSE,Session.AUTO_ACKNOWLEDGE);destination = session.createQueue("FirstQueue");consumer = session.createConsumer(destination);while (true) {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) {}}}
}

转载于:https://my.oschina.net/OutOfMemory/blog/596343

消息中间件-Activemq之Master-Slaver相关推荐

  1. 消息中间件-Activemq之Broker-Cluster

    2019独角兽企业重金招聘Python工程师标准>>> 接着上一篇消息中间件-Activemq之Master-Slaver,下面看看Broker-Cluster实现负载均衡 Brok ...

  2. 消息中间件ActiveMQ、RabbitMQ、RocketMQ、ZeroMQ、Kafka如何选型

    转载自 消息中间件ActiveMQ.RabbitMQ.RocketMQ.ZeroMQ.Kafka如何选型? 最近要为公司的消息队列中间件进行选型,市面上相关的开源技术又非常多,如ActiveMQ.Ra ...

  3. Redis 部署方式(单点、master/slaver、sentinel、cluster) 概念与区别

    在K8S上部署Redis集群时突然遇到一个(sentinel哨兵模式)概念,感觉Redis的概念还是很多的,什么主从模式.sentinel模式.集群模式的,一下子都晕了,我觉得还是有必要先理清这些基本 ...

  4. Redis 部署方式(单点、master/slaver、sentinel、cluster) 概念与区别 -- 敲黑板!!!=_=

    在K8S上部署Redis集群时突然遇到一个(sentinel哨兵模式)概念,感觉Redis的概念还是很多的,什么主从模式.sentinel模式.集群模式的,一下子都晕了,我觉得还是有必要先理清这些基本 ...

  5. 消息中间件activeMQ原理和使用

    一: 消息中间件的优势     1.使用消息中间件,降低了dubbo服务之间的耦合度,使得两个原本使用远程注入耦合了的模块可以实现松耦合,使用消息中间件进了间接通信.     2.缓冲能力,消息中间件 ...

  6. Java消息中间件(activeMQ)

    文章目录 **第一章 消息中间件概述** 1. 消息中间件的好处 2. 什么是消息中间件 3. 什么是JMS(规范) 4. 什么是AMQP(协议) 5. 几个常用消息中间对比 **第二章 初始JMS* ...

  7. python消息中间件activemq_消息中间件ActiveMQ和JMS基础

    MQ主要流程 解耦,异步,消峰 其中目的地主要为队列或者主题 队列点对点 消息的生产者 或者 这时消息的生产者名字已经出来 并且入队的数量变成了3 上述完成的也就是这部分 消息的消费者 前四步大同小异 ...

  8. 剑指offer之消息中间件ActiveMQ知识总结

    1.JMS(Java Message Service,Java消息服务) 1.1 定义 Java消息服务(Java Message Service,即JMS)应用程序接口是一个Java平台中关于面向消 ...

  9. 消息中间件ActiveMQ 5:可持久化方式AMQ和KahaDB

    文章目录 ActiveMQ 的持久化方式 一.需要进行消息持久化的原因 二.持久化方式 1.AMQ message Store(了解) 2.KahaDB消息存储(默认) ActiveMQ 的持久化方式 ...

  10. 消息中间件--ActiveMQ

    一.消息中间件(Message-Oriented) 1.1 什么是消息中间件 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排 ...

最新文章

  1. 数据中台解决的三大问题
  2. 一起谈.NET技术,.NET Framework源码研究系列之---万法归宗Object
  3. c++ 析构函数 ~
  4. 华为产品技术学习笔记之路由原理(二)
  5. 如何执行超过一百兆(100MB)的sql脚本?
  6. Windows上使用Git管理文件
  7. bzoj3144: [Hnoi2013]切糕(最小割)
  8. [react-router] React-Router 4的switch有什么用?
  9. 【转】VTK修炼之道2_VTK体系结构1
  10. 99%算法工程师不知道的if/else优化技巧
  11. 解决neo4j导入数据时报错:neo4j already contains data, cannot do import here报错
  12. linux 如何查看fb中分辨率_西门子S71200,如何在FB块中使用操作定时器?
  13. redis服务以及phpredis扩展的安装
  14. pascal与其它语言代码书写的不同和pascal的快捷键
  15. ajax异步获取右侧html,Ajax异步获取html数据中包含js方法无效的解决方法
  16. 【火炉炼AI】机器学习042-NLP文本的主题建模
  17. python与数据思维基础网课答案_智慧树知到_Python数据分析与数据可视化_答案免费查询...
  18. 科学家量子计算机时间倒流,科学家用量子计算机让“时间倒流”?并没有真的做到...
  19. 常工院计算机学院,常亚楠-华中师范大学计算机学院
  20. CRAFT(Character Region Awareness for Text Detection)

热门文章

  1. 【C语言】实现简易网络聊天室
  2. 【李小丫的笔记】DataWhale金融风控预测Task1
  3. Ngnix服务器详解(Windows版本)(非原创)
  4. 华为认证: 高级redhat例题及答案
  5. 《生命不能承受之轻》读书笔记(这本书有点看不懂)
  6. 计算功耗设备待机时间!
  7. 风雨java路之【基础篇】——异常的那些事儿
  8. 40个非常有创意的网页设计作品欣赏
  9. 数字转换成英文 金额转成英文大写
  10. Undefined symbol main (referred from entry9a.o).