ActiveMQ笔记:源码分析
本文对ActiveMQ的启动过程,以及BrokerService,TransportConnector和NetworkConnector等几个重要的模块的代码做一个简要的分析。
启动过程
如果要快速地了解系统的主要模块,最好的办法是熟悉该系统的启动过程。本文首先分析ActiveMQ的启动过程。
ActiveMQ可以作为一个独立的Java程序,单独运行。ActiveMQ也可以embed到其它的Java程序里面,作为该程序的一部分运行。
当ActiveMQ作为独立的程序运行时,实际执行的是${ActiveMQHome}/bin/ activemq.jar里的org.apache.activemq.console.Main。该Main类,可以执行activemq-console里的XXXCommand类定义的命令,根据传入Main类的XXX命令,调用相应的XXXCommand类命令。正常启动ActiveMQ,会使用“start”,因而会使用StartCommand类调用BrokerFactory.createBroker()来创建BrokerService。而该函数最终调用XBeanBrokerFactory.createBroker()创建XBeanBrokerService(是BrokerService的子类)。
如果ActiveMQ作为其它Java应用程序的一部分,常用的方法是使用Spring/XBean(XBean是在Spring的基础上进一步的简化了启动Bean所需要的配置)的机制。通过该机制,使用基于Spring的XML的配置文件,以及ActiveMQ的XBean定制的namespace,创建了XBeanBrokerService的bean。
可见,两种不同的方式,最终创建相同的XBeanBrokerService。该类的start()函数,通过创建Broker,TransportConnector,NetworkConnector等模块,完成ActiveMQ系统的启动。
TransportConnector
TransportConnector是ActiveMQ用来管理Client和Broker之间通信和传送消息的模块。
其中Transport接口定义了Client端和Broker通信的接口。ActiveMQ提供了多种Transport接口的实现类,如UDP,TCP,HTTP等。
TransportServer接口定义了Server端和Broker通信的接口。与Transport相对应,ActiveMQ提供了多种TransportServer接口的实现类,如UDP,TCP,HTTP等。
ActiveMQ定义了TransportFactory类,通过采用抽象工厂的Pattern,实现了ActiveMQ为不同的消息通信协议创建不同的Transport/TransportServer的实现。具体的TransportFactory实现类是通过active-client,active-http等jar文件的“META-INF/services/org/apache/activemq/transport/”定义的配置文件指定。

NetworkConnector
NetworkConnector是ActiveMQ用来管理Broker和Broker之间通信和传送消息的模块。ActiveMQ定义了几种NetworkConnector的实现类,缺省使用DiscoveryNetworkConnector类。
DiscoveryAgent是DiscoveryNetworkConnector用来发现互联的Broker的接口。ActiveMQ定义了多种的DiscoveryAgent的实现类,如HTTPDiscoveryAgent,SimpleDiscoveryAgent,MulticastDiscoveryAgent等。具体采用哪一种,是由< networkConnector>定义的URI的类型来决定。
Broker和Broker之间的通信和控制消息的交互是通过NetworkBridge来实现的。当DiscoveryAgent发现了互联的broker,会通知DiscoveryNetworkConnector,DiscoveryNetworkConnector会创建NetworkBridge来与新发现的Broker进行通信,实现消息互通。DiscoveryNetworkConnector,DiscoveryAgent和NetworkBridge通过XXXListener的机制实现状态控制。

ActiveMQ笔记:源码分析的更多相关文章
- bootstrap-modal 学习笔记 源码分析
Bootstrap是Twitter推出的一个开源的用于前端开发的工具包,怎么用直接官网 http://twitter.github.io/bootstrap/ 我博客的定位就是把这些年看过的源码给慢慢 ...
- STL源码分析读书笔记--第二章--空间配置器(allocator)
声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...
- memcached学习笔记——存储命令源码分析下篇
上一篇回顾:<memcached学习笔记——存储命令源码分析上篇>通过分析memcached的存储命令源码的过程,了解了memcached如何解析文本命令和mencached的内存管理机制 ...
- memcached学习笔记——存储命令源码分析上篇
原创文章,转载请标明,谢谢. 上一篇分析过memcached的连接模型,了解memcached是如何高效处理客户端连接,这一篇分析memcached源码中的process_update_command ...
- zeromq源码分析笔记之线程间收发命令(2)
在zeromq源码分析笔记之架构说到了zmq的整体架构,可以看到线程间通信包括两类,一类是用于收发命令,告知对象该调用什么方法去做什么事情,命令的结构由command_t结构体确定:另一类是socke ...
- Nginx学习笔记4 源码分析
Nginx学习笔记(四) 源码分析 源码分析 在茫茫的源码中,看到了几个好像挺熟悉的名字(socket/UDP/shmem).那就来看看这个文件吧!从简单的开始~~~ src/os/unix/Ngx_ ...
- OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...
- element-ui 组件源码分析整理笔记目录
element-ui button组件 radio组件源码分析整理笔记(一) element-ui switch组件源码分析整理笔记(二) element-ui inputNumber.Card .B ...
- element-ui Carousel 走马灯源码分析整理笔记(十一)
Carousel 走马灯源码分析整理笔记,这篇写的不详细,后面有空补充 main.vue <template> <!--走马灯的最外层包裹div--> <div clas ...
- 并发编程学习笔记(9)----AQS的共享模式源码分析及CountDownLatch使用及原理
1. AQS共享模式 前面已经说过了AQS的原理及独享模式的源码分析,今天就来学习共享模式下的AQS的几个接口的源码. 首先还是从顶级接口acquireShared()方法入手: public fin ...
随机推荐
- 关于input内容改变的触发时间
1.onchange onchange 事件会在域的内容改变时触发.支持的标签<input type="text">, <textarea>, <se ...
- 第二次作业--------STEAM
--------------------------------------第一部分 产品介绍----------------------------------------------------- ...
- C语言指针作业总结
学号 姓名 作业地址 PTA实验作业5 PTA排名2 阅读代码2 总结1 代码规范 总分 是否推荐博客 推荐理由 32 **薇 http://www.cnblogs.com/linyiwei/p/80 ...
- appcompat v21: 让 Android 5.0 前的设备支持 Material Design
1. 十大Material Design开源项目 2. appcompat v21: 让 Android 5.0 前的设备支持 Material Design 主题 AppCompat已经支持最新的调 ...
- php代码一样,编码不同报错
php代码一样,编码不同报错 两个php代码完全一样,但是就报错,比如说声明比如在very first,这种,可以把编码设置utf-8 无bom
- Oracle数据库游标精解
游标 定义:标识结果集中数据行的一种容器(CURSOR),游标允许应用程序对查询语句返回的行结果集中的每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作.实际上是一种能从包括多条数据记录 ...
- node防xss攻击插件
var xss = require('node-xss').clean; router.post("/orders/insert-orders", function (req, r ...
- Python内置函数(6)——round
英文文档: round(number[, ndigits]) Return the floating point value number rounded to ndigits digits afte ...
- Asp.net容器化
注意:本文只用于探讨asp.net容器化,不建议生产环境下使用(docker 镜像太大!!!!) 安装docker 准备一个台windwos server 2016 ,在PowerShell 里执行以 ...
- HTTP协议扫盲(七)请求报文之 GET、POST-FORM 和 POST-FILE
一.get 1.页面代码 2.请求报文 3.小结 get请求没有报文体,所以请求报文没有content-type url上的query参数param11=val11¶m12=val12 ...