工作四年已久,也快到了而立之年,本人也酷爱技术,总是想找一些途径来提升自己,想着温故而知新所以就写起了博客,然而写博客这个想法也是酝酿了很久,近期也看到了有很多人在问关于ActiveMQ的相关问题,有幸接触ActiveMQ从今天开始我会定期总结一些关于ActiveMQ的相关知识,本篇重点是先分析ActiveMQ的架构以及设计模式等相关知识,然后在说如何更好的使用,让ActiveMQ发挥最好的性能,欢迎大家跟帖讨论,有错误的地方还请大家不吝雅正,小方在此谢过!

第一篇文章我们先从hello world写起,下面是使用java代码调用activemq的api发送一条消息。

public class test {

public static void main(String[] args) throws Exception {

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(

"tcp://localhost:61616");

Connection connection = connectionFactory.createConnection();

connection.start();

Session session = connection.createSession(false,

Session.AUTO_ACKNOWLEDGE);

MessageProducer producer = session.createProducer(session

.createQueue("testQueue"));

Message message = session.createTextMessage("hello everybody!");

producer.send(message);

producer.close();

session.close();

connection.close();

}

}

下面来分析发送消息的几个步骤,如下:

1、创建ActiveMQConnectionFactory,入参是url,指定schema以及要连接的ip和端口号,其次是创建ActiveMQConnection,tcp协议交互肯定是要使用Socket类,所以说明下ActiveMQConnection->Transport->Socket的关系,Transport是对Socket的封装,而ActiveMQConnection则是对Transport的封装,如下图所示:

2、创建ActiveMQConnection,因为上图已经说明ActiveMQConnection和Transport是组合关系,所以创建ActiveMQConnection时首先要创建Transport,因为ActiveMQ的交互方式分为Tcp、Udp以及HTTP协议,ActiveMQ使用了非常经典的简单工厂设计模式,使用这个模式的好处是工厂可以根据uri的schema头来动态创建相应的TransportFactory工厂,例如用户输入tcp://localhost:61616,ObjectFactory则可以获取到schema是tcp然后来实例化TcpTransportFactory,然后在调用TcpTransportFactory工厂来生产TcpTransport对象,简单工厂模式如下图,我是把2个工厂画到了一起:          创建完TcpTransport还不够,因为TcpTransport只实现了发送和接受消息,还需要做一些封装来实现相应的业务处理,说到封装这里使用到了包装设计模式,也叫装饰者模式,jdk的java.io输入输出流也有使用,类图如下:

1、1、MutexTransportFilter类实现了对每个请求的同步锁,同一时间只允许发送一个请求,如果有第二个请求需要等待第一个请求发送完毕才可继续发送。

2、2、WireFormatNegotiator类实现了在客户端连接broker的时候先发送数据解析相关的协议信息,例如解析版本号,是否使用缓存等信息。

3、3、InactivityMonitor类实现了连接成功后启动心跳检查机制,客户端每10秒发送一次心跳信息,服务端每30秒读一次心跳信息,如果没有读到则会断开连接,心跳检测是相互的,客户端也会每30秒读取服务端发送来的心跳信息,如果没有读到也一样会断开连接。

4、4、ResponseCorrelator类实现了异步请求但需要获取响应信息否则就会阻塞等待功能。

创建ActiveMQConnection的时序图如下:

客户端调用createConnection()方法,通过TcpTransportFactory获取到TcpTransport对象,得到TcpTransport对象后,TcpTransportFactory又调用自己的configure方法对TcpTransport进行了包装,代码如下:

public Transport configure(Transport transport, WireFormat wf, Map options) throws Exception {

transport = compositeConfigure(transport, wf, options);

transport = new MutexTransport(transport);

transport = new ResponseCorrelator(transport);

return transport;

}

这就是包装设计模式的使用,当调用transport.request()发送消息时,时序图如下:

每次transport调用request方法时都会先判断next是否为空,如果不为空则先调用next.request(),当然在调用之前和之后都会加入相应的逻辑,包装设计模式的好处就是当我不想启动心跳检测功能时则可以非常简单的实现,只需要不为WireFormatNegotiator设置next属性为InactivityMonitor即可,获取加入其它功能不需要修改原来的设计只需要新增一个类即可,充分的体现了设计模式的开放封闭原则以及单一职责原则,设计模式在ActiveMQ中可以说是使用的淋漓尽致,恰到好处。

创建完ActiveMQConnection之后就是创建ActiveMQSession以及ActiveMQMessageProducer了,这两个对象的创建就比较简单了没什么可说的,当然在创建这些对象的时候客户端会发送相应的信息给服务端,本节主要讲解连接的建立。信息的交互以及Message的发送就留到下一节在说了,第一次写这么长的博文,可能有的地方讲的思路不清晰,还请大家多多指正,谢谢大家,睡觉了,明天还要加班!

http://www.iteye.com/topic/1137523

ActiveMQ源码架构解析第一节(转)的更多相关文章

  1. 深入解析Underscore.js源码架构

    Underscore.js是很有名的一个工具库,我也经常用他来处理对象,数组等,本文会深入解析Underscore源码架构,跟大家一起学习下他源码的亮点,然后模仿他写一个简单的架子来加深理解.他的源码 ...

  2. 使用CEF(三)— 从CEF官方Demo源码入手解析CEF架构与CefApp、CefClient对象

    在上文<使用CEF(2)- 基于VS2019编写一个简单CEF样例>中,我们介绍了如何编写一个CEF的样例,在文章中提供了一些代码清单,在这些代码清单中提到了一些CEF的定义的类,例如Ce ...

  3. Retrofit源码设计模式解析(下)

    本文将接着<Retrofit源码设计模式解析(上)>,继续分享以下设计模式在Retrofit中的应用: 适配器模式 策略模式 观察者模式 单例模式 原型模式 享元模式 一.适配器模式 在上 ...

  4. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

  5. 《淘宝数据库OceanBase SQL编译器部分 源码阅读--解析SQL语法树》

    淘宝数据库OceanBase SQL编译器部分 源码阅读--解析SQL语法树   曾经的学渣 2014-06-05 18:38:00 浏览1455 云数据库Oceanbase   OceanBase是 ...

  6. Spring框架之AOP源码完全解析

    Spring框架之AOP源码完全解析 Spring可以说是Java企业开发里最重要的技术.Spring两大核心IOC(Inversion of Control控制反转)和AOP(Aspect Orie ...

  7. Spring框架之jms源码完全解析

    Spring框架之jms源码完全解析 我们在前两篇文章中介绍了Spring两大核心IOC(Inversion of Control控制反转)和AOP(Aspect Oriented Programmi ...

  8. Thrift之代码生成器Compiler原理及源码详细解析1

    我的新浪微博:http://weibo.com/freshairbrucewoo. 欢迎大家相互交流,共同提高技术. 又很久没有写博客了,最近忙着研究GlusterFS,本来周末打算写几篇博客的,但是 ...

  9. spring源码深度解析— IOC 之 容器的基本实现

    概述 上一篇我们搭建完Spring源码阅读环境,spring源码深度解析—Spring的整体架构和环境搭建 这篇我们开始真正的阅读Spring的源码,分析spring的源码之前我们先来简单回顾下spr ...

随机推荐

  1. Android API中被忽略的几个函数接口

    1. MotionEvent的几个函数 下面的方法都支持多点触摸,即可以对单个触摸点调用下面的方法 1.1 getPressure() 这个api 可以获取到手指触摸屏幕时候的压力,但是需要硬件和驱动 ...

  2. Delphi中使用GDI+进行绘图(1)

    Delphi的VCL类库中,默认使用的是GDI绘图接口,该接口封装了Win32 GDI接口,能够满足基本的绘图功能,但如果要实现更高级的绘图功能,往往比较困难,GDI+是微软在GDI之后的一个图形接口 ...

  3. VC/MFC ListCtrl 控件功能使用汇总(转)

    以下未经说明,listctrl默认view 风格为report 相关类及处理函数 MFC:CListCtrl类 SDK:以 “ListView_”开头的一些宏.如 ListView_InsertCol ...

  4. mysql union ,UNION RESULT

    mysql> explain select * from t100 union all select * from t200; +----+--------------+------------ ...

  5. Ubuntu升级到14.04

    公司网络实在太翔了,搞了一天最终成功把ubuntu从13.10升级到了14.10,中间也越到了非常多问题,记录下来,以备參考. 13.10的时候想体验一把搜狗输入法,结果因为fcitx版本号太低,用了 ...

  6. Html中隐藏a标签

    <div><a href="#"><span style="visibility:hidden">我的</span&g ...

  7. 如何配置Git支持大小写敏感和修改文件名中大小写字母呢?(转)

    1. 在新建代码文件时,不注意把文件名应该小小写搞错了2. 文件已经push到远程了3. 在windows下面将文件名字改为全小写 改好后,在Git中没有任何反应,使用git status时,如果遇到 ...

  8. 更改windows系统语言,改为英文

  9. 8592 KMP算法

    8592 KMP算法 时间限制:1000MS  内存限制:1000K 题型: 编程题   语言: 无限制 描写叙述 用KMP算法对主串和模式串进行模式匹配. 本题目给出部分代码.请补全内容. #inc ...

  10. 指尖上的电商---(12)SolrAdmin中加入多核的还有一种方法

    这一节中我们演示下solr中创建多核的还有一种方法. 接第10讲,首先关闭tomcatserver 1.解压solr-4.8.0后,找到solr-4.8.0以下的example目录下的multicor ...